#include<iostream>
#include<queue>
#include<vector>

using namespace std;

int di[4] = {1,0,-1,0};
int dj[4] = {0,-1,0,1};

int main()
{
	int h,w;
	string s[20];

	cin>>h>>w;
	for(int i = 0;i<h;i++)
		cin>>s[i];

	int res=0;

	for(int si=0;si<h;si++)
	for(int sj=0;sj<w;sj++)
	{
		if(s[si][sj]=='#') continue;

		int dis[25][25];
		for(int i=0;i<h;i++)
		for(int j=0;j<w;j++)
			dis[i][j]=1e9;

		typedef pair<int,pair<int,int>> P;
		priority_queue<P,vector<P>,greater<P>> q;
		q.push({0,{si,sj}});

		while(q.size())
		{
			auto p = q.top();
			q.pop();

			int i= p.second.first;
			int j= p.second.second;

			if(dis[i][j]<=p.first) continue;
			if(s[i][j]=='#') continue;

			dis[i][j]=p.first;

			for(int k=0;k<4;k++)
			{
				int ni=i+di[k];
				int nj=j+dj[k];

				if(ni<0||h<=ni||nj<0||w<=nj)continue;
				if(p.first+1>=dis[ni][nj])continue;

				q.push({p.first+1,{ni,nj}});
			}
		}


	for(int gi=0;gi<h;gi++)
	for(int gj=0;gj<w;gj++)
	if(s[gi][gj]!='#')
		res = max(res,dis[gi][gj]);
	}
			
	cout<<res<<endl;
}
