#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<(n);++i)

#define FOR(i,n,j) for(int i=(j);i<(n);++i)
#define ssort(n) sort((n).begin(),(n).end())
#define rsort(n) sort((n).begin(),(n).end(),greater<int>())
using ll=long long;
using ld=long double;
typedef pair<int,int> P;
typedef pair<P,int> COST;
#define repl(i,n) for(ll i=0;i<(n);++i)
#define Yes cout << "Yes" << endl
#define No cout << "No" << endl
#define YES cout << "YES" << endl
#define NO cout << "NO" << endl

int main()
{
    int h,w;
    cin >> h >> w;
    vector<string> s(h);
    vector<vector<bool>> is_visit(h,vector<bool>(w));
    rep(i,h){
        cin >> s[i];
    }
    int max=0;
    queue<COST> q;
    P p;
    COST c;
    rep(i,h){
        rep(j,w){
            if(s[i][j]=='.'){
                rep(k,h){
                    rep(l,w){
                        is_visit[k][l]=false;
                    }
                }
                
                p.first=i;p.second=j;
                c.first=p;c.second=0;
                q.push(c);
                int path_leng=0;
                while(!q.empty()){
                    COST a=q.front();
                    is_visit[a.first.first][a.first.second]=true;
                    q.pop();

                    if(a.first.first<h-1){
                        if(s[a.first.first+1][a.first.second]=='.'){
                            if(is_visit[a.first.first+1][a.first.second]==false){
                                p.first=a.first.first+1;p.second=a.first.second;
                                c.first=p;c.second=a.second+1;
                                if(a.second+1>max){
                                    
                                    max=a.second+1;
                                    //cout << max << endl;
                                }
                                q.push(c);
                                is_visit[a.first.first+1][a.first.second]=true;
                            }

                        }
                    }                    
                    if(a.first.first>0){
                        if(s[a.first.first-1][a.first.second]=='.'){
                            if(is_visit[a.first.first-1][a.first.second]==false){
                                p.first=a.first.first-1;p.second=a.first.second;
                                c.first=p;c.second=a.second+1;
                                if(a.second+1>max){
                                    max=a.second+1;
                                    //cout << max << endl;
                                }
                                q.push(c);
                                is_visit[a.first.first-1][a.first.second]=true;
                            }

                        }
                    }                    
                    if(a.first.second>0){
                        if(s[a.first.first][a.first.second-1]=='.'){
                            if(is_visit[a.first.first][a.first.second-1]==false){
                                p.first=a.first.first;p.second=a.first.second-1;
                                c.first=p;c.second=a.second+1;
                                if(a.second+1>max){
                                    max=a.second+1;
                                    //
                                    //cout << max << endl;
                                }
                                q.push(c);
                                is_visit[a.first.first][a.first.second-1]=true;
                            }

                        }
                    }                
                    if(a.first.second<w-1){
                        if(s[a.first.first][a.first.second+1]=='.'){
                            if(is_visit[a.first.first][a.first.second+1]==false){
                                p.first=a.first.first;p.second=a.first.second+1;
                                c.first=p;c.second=a.second+1;
                                if(a.second+1>max){
                                    max=a.second+1;
                                    //cout << max << endl;
                                }
                                q.push(c);
                                is_visit[a.first.first][a.first.second+1]=true;
                            }

                        }
                    }

                }
            }
        }
    }
    cout << max << endl;
}

Measured memory_bytes: 3644