#include<bits/stdc++.h>
using namespace std;
int n,m; 
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1},ans=-1000;
int dis[30][30],vis[30][30];
char a[30][30];
struct fwy{
	int xx,yy;
};
queue<fwy> q;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=m;j++){
    		cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]=='#') continue;
			memset(dis,0,sizeof(dis));
			memset(vis,0,sizeof(vis));
			q.push((fwy){
				i,j
			});
			vis[i][j]=1;
			while(!q.empty()){
				fwy t=q.front();
				q.pop();
				for(int k=0;k<4;k++){
					int tx=t.xx+dx[k],ty=t.yy+dy[k];
					if(a[tx][ty]!='#'&&tx<=n&&tx>=1&&ty<=m&&ty>=1&&!vis[tx][ty]){
						vis[tx][ty]=1;
						dis[tx][ty]=dis[t.xx][t.yy]+1;
						ans=max(ans,dis[tx][ty]);
						q.push((fwy){
							tx,ty
						});
					}
				}
			}
		}
	}
	cout<<ans;
}