#include<bits/stdc++.h>
using namespace std;
long long ans[25][25][25][25];
long long H , W;
char c[25][25];

struct az
{
	int x;
	int y;
	int cnt;
}q[1000005];

int main()
{
	scanf("%d%d",&H,&W);
	for(int i=1;i<=H;++i)
	   for(int j=1;j<=W;++j)
	       scanf(" %c",&c[i][j]);
	for(int i=1;i<=H;++i)
	{
		for(int j=1;j<=W;++j)
		{
			if(c[i][j]=='#') continue;
			int l=0,r=1;
			q[1].x=i;
			q[1].y=j;
			q[1].cnt=0;
			while(l<r)
			{
				++l;
				int dx=q[l].x;
				int dy=q[l].y;
				int now=q[l].cnt;
				if(dx > 1 && !ans[i][j][dx-1][dy] && c[dx-1][dy] !='#') 
				{
					++r;
					q[r].x=dx-1;
					q[r].y=dy;
					q[r].cnt=now+1;
					ans[i][j][dx-1][dy]=now+1;
				}
				if(dy > 1 && !ans[i][j][dx][dy-1] && c[dx][dy-1] !='#') 
				{
					++r;
					q[r].x=dx;
					q[r].y=dy-1;
					q[r].cnt=now+1;
					ans[i][j][dx][dy-1]=now+1;
				}
				if(dx < H && !ans[i][j][dx+1][dy] && c[dx+1][dy] !='#') 
				{
					++r;
					q[r].x=dx+1;
					q[r].y=dy;
					q[r].cnt=now+1;
					ans[i][j][dx+1][dy]=now+1;
				}
				if(dy < W && !ans[i][j][dx][dy+1] && c[dx][dy+1] !='#') 
				{
					++r;
					q[r].x=dx;
					q[r].y=dy+1;
					q[r].cnt=now+1;
					ans[i][j][dx][dy+1]=now+1;
				}
			}
		}
	}
	int sum=0;
	for(int i=1;i<=H;++i)
		for(int j=1;j<=W;++j)
			for(int k=1;k<=H;++k)
			   for(int s=1;s<=W;++s)
			       sum=max(sum,ans[i][j][k][s]);
	//cout<<ans[3][1][1][5]<<endl;
	printf("%lld\n",sum);
	return 0;
}