#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
#define N 50
int dis[N][N],vis[N][N],ans;
char s[N][N];
struct nade{
	int x,y;
};
queue<nade>que;
int n,m;
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
int spfa(int sx,int sy){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			dis[i][j]=1e9;
	dis[sx][sy]=0;
	que.push(nade{sx,sy});
	while(!que.empty()){
		nade now=que.front();
		que.pop();vis[now.x][now.y]=0;
		for(int i=0;i<4;i++){
			int x=now.x+dx[i],y=now.y+dy[i];
			if(x<1||y<1||x>n||y>m||s[x][y]=='#')continue;
			if(dis[x][y]>dis[now.x][now.y]+1){
				dis[x][y]=dis[now.x][now.y]+1;
				if(!vis[x][y]){
					vis[x][y]=1;
					que.push(nade{x,y});
				}
			}
		}
	}
	int sum=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			sum=max(sum,dis[i][j]!=1e9?dis[i][j]:0);
	return sum;
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%s",s[i]+1);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(s[i][j]=='.')ans=max(ans,spfa(i,j));
	printf("%d\n",ans);
}