#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#include <random>
#include <chrono>
#include <iomanip>
#define lint unsigned long long int
#define FOR(x, to) for(int x=0; x<(int)(to); x++)
#define DUMP(ar) for(auto itd=begin(ar); itd != end(ar); itd++) cout << "["s << itd - begin(ar) << "]:"s << *itd << endl
#define DUMPL(ar) for(auto itd=begin(ar); itd != end(ar); itd++) { cout << setw(4) << *itd; if(end(ar)-itd > 1) cout << ' '; } cout << endl
#define COUT(x) cout << (x) << endl
#define VCIN(ar) for(auto &vcin: (ar)) cin >> vcin
#define ALL(ar) ar.begin(), ar.end()
#define LOOPD(i) cout << "ループ["s << i << "]回目---------------"s << endl
using namespace std;
// lint:64ビット 10^19

struct point{
    int x;
    int y;
};

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    int h, w;
    cin >> h >> w;
    vector<vector<char>> c(h, vector<char>(w));
    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++){
            cin >> c[i][j];
        }
    }

    vector<vector<int>> d(h*w, vector<int>(h*w, 9999));
    for(int i=0; i<h*w; i++){ // 点1
        for(int j=0; j<h*w; j++){ // 点2
            if(i == j){
                d[i][i] = 0;
            }else if(j/w == i/w && j == i + 1){ // 右
                if(c[i/w][j%w] == '#') d[i][j] = 9999;
                else d[i][j] = 1;
            }else if(j/w == i/w && j == i - 1){ // 左
                if(c[i/w][j%w] == '#') d[i][j] = 9999;
                else d[i][j] = 1;
            }else if(j % w == i % w && j / w == (i / w) - 1){ // 上
                if(c[j/w][j%w] == '#') d[i][j] = 9999;
                else d[i][j] = 1;
            }else if(j % w == i % w && j / w == (i / w) + 1){ // 下
                if(c[j/w][j%w] == '#') d[i][j] = 9999;
                else d[i][j] = 1;
            }
        }
    }

    for(int k=0; k<h*w; k++) // 中継点
        for(int i=0; i<h*w; i++) // 始点
            for(int j=0; j<h*w; j++) // 終点
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);

    // for(int i=0; i<h*w; i++){
    //     DUMPL(d[i]);
    // }

    int mmax = 0;
    for(int i=0; i<h*w; i++){
        for(int j=0; j<h*w; j++){
            if(d[i][j] != 9999 && d[i][j] > mmax){
                mmax = d[i][j];
            }    
        }
    }
    COUT(mmax);

    return 0;
}