
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,sum,ex,ey;
char map[1010][1010];
int vis[1010][1010];
int d[4][2]={1,0,0,1,-1,0,0,-1};
bool judge(int x,int y)
{
	if(x>=0&&x<m&&y>=0&&y<n&&map[x][y]!='#')
	return true;
	return false;
}
struct node
{
	int x,y,step;
}now,next;
void bfs(int sx,int sy)
{
	queue<node>q;
	memset(vis,0,sizeof(vis));
	vis[sx][sy]=1;
	now.x=sx;
	now.y=sy;
	now.step=0;
	sum=0;
	q.push(now);
	while(!q.empty())
	{
		now=q.front();
		q.pop();
		for(int i=0;i<4;i++)
		{
			next.x=now.x+d[i][0];
			next.y=now.y+d[i][1];
			if(judge(next.x,next.y))
			{
			next.step=now.step+1;
				if(vis[next.x][next.y]==0)
				{

					vis[next.x][next.y]=1;
					if(sum<next.step)
					{
						sum=next.step;
						ex=next.x;//记录中间端点值
						ey=next.y;
					}
					q.push(next);
				}
			}
		}
	}

}
using namespace std;
int main()
{
	int t,sx,sy;

		scanf("%d%d",&m,&n);
		for(int i=0;i<m;i++)
		scanf("%s",&map[i]);
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(map[i][j]=='.')
				{
				sx=i;
				sy=j;
				break;
				}
			}
		}
		bfs(sx,sy);
		bfs(ex,ey);
		printf("%d\n", sum);

	return 0;
}
