#include <bits/stdc++.h>
#define rep(i,n) for (int i = 0; i < (n); ++i)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int INF = 1001001001;
const int di = {-1, 0, 1, 0};
const int dj = {0, -1, 0, 1};

int main(){
    int h, w;
    cin >> h >> w;
    vector<string> s(h);
    rep(i,h) cin >> s[i];
    int ans = 0;
    rep(si,h)rep(sj,w){
            if(s[si][sj]=='#') continue;
            vector<vector<int>> dist(h, vector<int>(w, INF));
            //配列に初期値 vector<型>(要素数,初期値)
            queue<P> q;
            auto update[&](int i, int j, int x){
                if(dist[i][j]!= INF) return;
                dist[i][j] = x;
                q.emplace(i,j); //push(P(i,j))
            
            };
            update(si,sj,0);
            while(!q.empty()){ //qが空になるまで
                int i = q.front().first;
                int j = q.front().second;
                q.pop(); //ないとずっと回り続ける
                rep(dir,4){
                    int ni = i + di[dir];
                    int nj = j + dj[dir];
                    if(ni<0 || ni>=h || nj<0 || nj>w) continue;
                    if(s[ni][nj]=='#') continue;
                    update(ni, nj, dist[i][j]+1);
                }
            }
            rep(i,h)rep(j,w){
                if(dist[i][j] == INF) continue;
                ans = max(ans, dist[i][j]);

            }
        }
        cout << ans << endl;
        return 0;
    }
   
