#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace __gnu_pbds;
using namespace std;
const long long llINF = 9223372036854775807;
const int INF = 2147483647;
const int maxn = 2e5 + 7;
const int maxm = 1e6 + 7;
const int ALP = 26;
const long long mod = 1e9 + 7;
const double pi = acos(-1.0);
const double eps = 1e-8;

int H,W;
char pic[40][40];
queue<pair<int,int> > Q;

int dis[23][23];

int ans;

bool can_go(int x,int y)
{
	return x>=1 && x<=H && y>=1 && y<=W && pic[x][y]=='.' && dis[x][y] == -1;
}

int solve(int sx,int sy)
{
	memset(dis,-1,sizeof(dis));
	Q.push(make_pair(sx,sy));
	dis[sx][sy]=0;

	while(!Q.empty())
	{
		pair<int,int> tmp=Q.front();
		Q.pop();
		if(can_go(tmp.first+1,tmp.second))
		{
			dis[tmp.first+1][tmp.second]=dis[tmp.first][tmp.second]+1;
			Q.push(make_pair(tmp.first+1,tmp.second));
		}
		if(can_go(tmp.first-1,tmp.second))
		{
			dis[tmp.first-1][tmp.second]=dis[tmp.first][tmp.second]+1;
			Q.push(make_pair(tmp.first-1,tmp.second));
		}
		if(can_go(tmp.first,tmp.second-1))
		{
			dis[tmp.first][tmp.second-1]=dis[tmp.first][tmp.second]+1;
			Q.push(make_pair(tmp.first,tmp.second-1));
		}
		if(can_go(tmp.first,tmp.second+1))
		{
			dis[tmp.first][tmp.second+1]=dis[tmp.first][tmp.second]+1;
			Q.push(make_pair(tmp.first,tmp.second+1));
		}
	}
}

void check()
{
	for(int i=1;i<=H;i++)
		for(int j=1;j<=W;j++)
			ans=max(ans,dis[i][j]);
}

int main()
{
	//freopen("1.in","r",stdin);
	scanf("%d%d",&H,&W);
	for(int i=1;i<=H;i++)
		scanf("%s",pic[i]+1);

	for(int sx=1;sx<=H;sx++)
	{
		for(int sy=1;sy<=W;sy++)
		{
			solve(sx,sy);
			check();
		}
	}
	
	printf("%d\n",ans);

	return 0;
}
