#include<bits/stdc++.h>
const int maxn=51;
using namespace std;

struct node
{
	int x,y,w;
};
int G[maxn][maxn];
int vis[maxn][maxn];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int ans=0;
int n,m;
void bfs(int x,int y,int acout)
{
	vis[x][y]=1;
	queue<node> q;
	q.push({x,y,0});
	while(!q.empty())
	{
		node np=q.front();q.pop();
		int x1=np.x;
		int y1=np.y;
		int w=np.w;
		ans=max(ans,w);
		for(int i=0;i<4;i++)
		{
			int nx=x1+dx[i];
			int ny=y1+dy[i];
			if(nx<=n && nx>0 && ny<=m && ny>0 && G[nx][ny]==1 && vis[nx][ny]==0)
			{
				vis[nx][ny]=1;
				q.push({nx,ny,w+1});
			}
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		string s;
		cin>>s;
		for(int j=0;j<s.length();j++)
		{
			if(s[j]=='.') G[i][j+1]=1;
			else G[i][j+1]=0;
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(G[i][j]==1)
			{
				memset(vis,0,sizeof(vis));
				bfs(i,j,0);
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}