#include<bits/stdc++.h>
using namespace std;
const int N=22;
const int dx[]={0,1,0,-1};
const int dy[]={-1,0,1,0};
int n,m,ans=0;
bool mp[N][N];
#define fe(i,j,n,m) for(int i=1; i<=n; i++)\
					for(int j=1; j<=m; j++)
struct szc{int x,y,dis;};
int bfs(int X,int Y)
{
	bool vis[N][N];
	fe(i,j,n,m) vis[i][j]=mp[i][j];
	queue <szc> q;
	q.push({X,Y,0});
	vis[X][Y]=1;
	int D=0;
	while(!q.empty())
	{
		szc t=q.front();q.pop();
		int x=t.x,y=t.y,dis=t.dis;
		D=max(D,dis);
		for(int i=0; i<4; i++)
		{
			int xx=x+dx[i];
			int yy=y+dy[i];
			if(xx<1||xx>n||yy<1||yy>m||vis[xx][yy]) continue;
			vis[xx][yy]=1;
			q.push({xx,yy,dis+1});
		}
	}
	return D;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++)
	{
		char c;getchar();
		for(int j=1; j<=m; j++)
		{
			c=getchar();
			mp[i][j]=c=='#';
		}
	}
	getchar();
	fe(i,j,n,m) if(!mp[i][j]) ans=max(ans,bfs(i,j));
	printf("%d\n",ans);
	return 0;
}
