#include<bits/stdc++.h>
using namespace std;
#define FASTIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define mod 1000000007
#define mp make_pair
#define pb push_back
#define ff first
#define ss second
int main(){
FASTIO
int h,w;
cin>>h>>w;
vector<string> s(h);
for(int i=0;i<h;i++){
	cin>>s[i];
}
vector<vector<int> > v(h*w,vector<int>(h*w,INT_MAX));
for(int i=0;i<h;i++){
    for(int j=0;j<w;j++){
    	if((i-1)>=0){
    		if(s[i-1][j]!='#')
    		v[j+i*w][j+(i-1)*w]=1;
		}
		if((i+1)<h){
			if(s[i+1][j]!='#')
    		v[j+i*w][j+(i+1)*w]=1;
		}
		if((j-1)>=0){
			if(s[i][j-1]!='#')
    		v[j+i*w][j-1+(i)*w]=1;
		}if((j+1)<w){
			if(s[i][j+1]!='#')
    		v[j+i*w][j+1+i*w]=1;
		}
	}
}
for(int i=0;i<h*w;i++){
	for(int j=0;j<h*w;j++){
		if(i==j)
		   v[i][j]=0;
	}
}
for(int k=0;k<h*w;k++){
	for(int i=0;i<h*w;i++){
		for(int j=0;j<h*w;j++){
			if((v[i][k]==INT_MAX)||(v[k][j]==INT_MAX))
			      continue;
			if(v[i][j]>v[i][k]+v[k][j]){
				v[i][j]=v[i][k]+v[k][j];
			}
		}
	}
}
int ans=0;
for(int i=0;i<h*w;i++){
	for(int j=0;j<h*w;j++){
		//cout<<v[i][j]<<" ";
		if(v[i][j]!=INT_MAX){
			ans=max(ans,v[i][j]);
		}
	}
	//cout<<"\n";
}
cout<<ans;
}
