# include<iostream>
# include<queue>
using namespace std;
struct P{
	int x;
	int y;
	P(int x,int y):x(x),y(y){
	}
};

char maze[100][100];
int a[100][100];
int H,W;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int MAX=0;
void init()
{
	for(int i=0;i<H;i++)
	{
		for(int j=0;j<W;j++)
		{
			a[i][j]= -1;
		}
	}
}
void bfs(int i,int j)
{
	queue<P> que;
	que.push(P(i,j));
    a[i][j]=0;
	while(!que.empty())
	{
		P p = que.front();
		que.pop();
		for(int i=0;i<4;i++)
		{
			 int nx = p.x+dx[i];
			 int ny = p.y+dy[i];
			 if(nx>=0&&nx<H&&ny>=0&&ny<W&&maze[nx][ny]=='.'&&a[nx][ny]==-1)
			 {
			 	a[nx][ny]= a[p.x][p.y]+1;
			 	MAX = max(MAX,a[nx][ny]);
			 	que.push(P(nx,ny));
			 }
		}
	}
}

int main ()
{

	 cin>>H>>W;

	 for(int i=0;i<H;i++)
	 {
	 	 for(int j=0;j<W;j++)
	 	 {
	 	 	 cin>>maze[i][j]; 	 	
		  }
	 }
	 
	 for(int i=0;i<H;i++)
	 {
	 	 for(int j=0;j<W;j++)
	 	 {
	 	 	  if(maze[i][j]=='.')
			 {
			      init();
				 
				  bfs(i,j);
				 
			 }	 	
		  }
	 }	
	  cout<<MAX<<endl;
	
}