#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll inf=1e15;
ll h,w,dis[510][510];
ll dy[4]={0,-1,0,1},dx[4]={1,0,-1,0};
char c[510][510];
ll dfs(ll sy,ll sx,ll gy,ll gx){
	queue<pair<ll,ll>> que;
	for(int i=0;i<h;i++)for(int j=0;j<w;j++)dis[i][j]=inf;
	que.push(pair<ll,ll>(sy,sx));
	dis[sy][sx]=0;
	while(!que.empty()){
		pair<ll,ll> now=que.front();
		que.pop();
		if(now.first==gy&&now.second==gx)break;
		for(int i=0;i<4;i++){
			ll ny,nx;
			ny=now.first+dy[i];
			nx=now.second+dx[i];
			if(nx>=0&&ny>=0&&ny<h&&nx<w&&c[ny][nx]=='.'&&dis[ny][nx]==inf){
				que.push(pair<ll,ll>(ny,nx));
				dis[ny][nx]=dis[now.first][now.second]+1;
			}
		}
	}
	return dis[gy][gx];
}
int main(){
	cin>>h>>w;
	for(int i=0;i<h;i++)for(int j=0;j<w;j++)cin>>c[i][j];
	ll ans=0;
	for(int i=0;i<h;i++){
		for(int j=0;j<w;j++){
			for(int k=0;k<h;k++){
				for(int l=0;l<w;l++){
					if(c[i][j]=='.'&&c[k][l]=='.')ans=max(ans,dfs(i,j,k,l));
				}
			}
		}
	}
	cout<<ans;
	return 0;
}
