#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define LL long long 
#define LD long double
const int X[4]={0,0,1,-1};
const int Y[4]={1,-1,0,0};
char p[25][25];
int n,m,vis[25][25],ans,dis[25][25];
void spfa(int nowx,int nowy)
{
	queue<int>qx,qy;
	memset(dis,0x3f,sizeof(dis));
	qx.push(nowx);qy.push(nowy);
	dis[nowx][nowy]=0;
	while(!qx.empty())
	{
		int x=qx.front(),y=qy.front();
		qx.pop();qy.pop();
		for(int t=0;t<4;t++)
		{
			int nx=X[t]+x,ny=Y[t]+y;
			if(nx<1||nx>n||ny<1||ny>m||dis[nx][ny]!=0x3f3f3f3f)continue;
			if(p[nx][ny]=='.')
			{
				dis[nx][ny]=dis[x][y]+1;
				ans=max(dis[nx][ny],ans);
				qx.push(nx);
				qy.push(ny);
			}
		}	
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		cin>>(p[i]+1);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(p[i][j]=='#')continue;
			spfa(i,j);
		}
	}
	cout<<ans<<endl;
}