#include <bits/stdc++.h>

using namespace std;
#define int long long


#define ff first
#define ss second
#define endl "\n"
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x.size())
#define PI 3.1415926535897932384626433832795
int MOD=1e9+7;
int powmod(int a,int l, int md){int res=1;while(l){if(l&1)res=res*a%md;l/=2;a=a*a%md;}return res;}
int binpow(int a,int l){int res=1;while(l){if(l&1)res=res*a;l/=2;a=a*a;}return res;}
typedef long long ll; typedef vector<ll> vi; typedef pair<ll, ll> ii; typedef vector<ii> vii;
#define pb push_back
int __set(int b, int i) {return b|(1<<i);} //set ith bit
int __unset(int b, int i) {return b&(~(1UL<<i));}
int __check(int b, int i) {return b&(1<<i);} //returns 0 if ith bit is 0
int mulmod(int a, int b, int md) {return ((a%md)*(b%md))%md;}
int addmod(int a, int b, int md) {return (a+b)%md;}
int submod(int a, int b, int md) {return (((a-b)%md)+md)%md;}
int divmod(int a, int b, int md) {return mulmod(a, powmod(b, md-2, md), md);} //if md is prime;
const ll inf = 0xFFFFFFFFFFFFFFFL; //very large number
// priority_queue<int, vector<int>, greater<int> > pq; //for min priority_queue
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
clock_t time_p=clock();
void time()
{
    time_p=clock()-time_p;
    cerr<<"Time Taken : "<<(float)(time_p)/CLOCKS_PER_SEC<<"\n";
}

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int getRand(int l, int r)
{
	uniform_int_distribution<int> uid(l, r);
	return uid(rng);
}

int dx[]={0,0,1,-1}, dy[]={1,-1,0,0};
signed main(void)
{
	IOS;
	// int n,k,m; cin>>n>>k>>m;
	// int vv=n*m;
	// for(int i = 0; i < n-1; i++) {
	// 	int x; cin>>x;
	// 	vv-=x;
	// }
	// if(vv<=0) {
	// 	cout<<0<<endl;
	// } else if(vv > k) {
	// 	cout<<-1<<endl;
	// } else {
	// 	cout<<vv<<endl;
	// }

	// char c;
	// cin>>c;
	// cout<<(char)(c+1)<<endl;

	// int n,m; cin>>n>>m;
	// vi ac(n,-1);
	// vector<vi> wa(n);
	// for(int i = 0; i < m; i++) {
	// 	int p; string w;
	// 	cin>>p>>w;
	// 	if(w=="AC") {
	// 		if(ac[p-1]==-1)
	// 			ac[p-1]=i;
	// 	} else {
	// 		wa[p-1].pb(i);
	// 	}
	// }
	// int cc=0,pp=0;
	// for(int i = 0; i < n; i++) {
	// 	if(ac[i]==-1) {
	// 		pp += sz(wa[i]);
	// 	} else {
	// 		cc++;
	// 		if(sz(wa[i])==0) continue;
	// 		int id = lower_bound(all(wa[i]),ac[i])-wa[i].begin();
	// 		pp += id;
	// 	}
	// }
	// cout<<cc<<" "<<pp<<endl;

	int h,w;
	cin>>h>>w;
	vector<string> mat(h);
	vector<vi> adj(h*w);
	for(int i = 0; i < h; i++) {
		cin>>mat[i];
	}
	int n=w*h;
	int d[n][n];
	for(int i = 0 ; i < n; i++) {
		for(int j = 0; j < n; j++)
			d[i][j]=inf;
	}
	for(int i = 0;i < n; i++)
		d[i][i]=0;
	for(int i = 0; i < h; i++) {
		for(int j = 0; j < w; j++) {
			for(int k = 0; k < 4; k++) {
				if(i+dx[k]>=0 && i+dx[k]<h && j+dy[k]>=0 && j+dy[k]<w && mat[i+dx[k]][j+dy[k]]=='.' && mat[i][j]=='.') {
					int ii = i+dx[k], jj = j+dy[k];
					// adj[i*w+j].pb(ii*w+jj);
					d[i*w+j][ii*w+jj]=1;
				}
			}
		}
	}
	for (int k = 0; k < n; ++k) {
	    for (int i = 0; i < n; ++i) {
	        for (int j = 0; j < n; ++j) {
	            if (d[i][k] < inf && d[k][j] < inf)
	                d[i][j] = min(d[i][j], d[i][k] + d[k][j]); 
	        }
	    }
	}
	int ans=-1;
	for(int i = 0; i < n; i++) {
		for(int j = i+1; j < n; j++) {
			if(d[i][j] != inf)
				ans=max(ans,d[i][j]);
		}
	}
	cout<<ans<<endl;
	return 0;
}

Measured memory_bytes: 1664