#include <bits/stdc++.h>
using namespace std;
#define fi first
#define endl "\n"
#define se second
#define ls( s) (s&(-s))
#define ll long long
#define inf 0x3f3f3f3f
const ll N = 200030;
#define rep(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
const ll mod =    1e9+7;
int h,w;
string s[25];
bool valid(int x,int y)
{
	if(x>=0&&x<h&&y>=0&&y<w)
	return true;
	return false;
}
int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>h>>w;
rep(i,0,h)
cin>>s[i];
int mx=0;
for(int i=0;i<h;i++)
{
	for(int j=0;j<w;j++)
	{
		if(s[i][j]=='.')
		{
			bool bo[30][30];
			memset(bo,false,sizeof(bo));
			queue<pair<int,int> > q;
			q.push({i,j});
			q.push({-1,-1});
			int cnt=0;
			while(!q.empty())
			{

				pair<int,int> p;
				p=q.front();
					q.pop();
					
				if(p.fi==-1){

				cnt++;

				if(!q.front())
				break;
				q.push({-1,-1});}
				else
				{

				bo[p.fi][p.se]=true;

				int a[4]={-1,0,1,0};
				int b[4]={0,-1,0,1};
				bool g=false;

				for(int k=0;k<4;k++)
				{
					if(valid(p.fi+a[k],p.se+b[k])&&s[p.fi+a[k]][p.se+b[k]]!='#')
					if(bo[p.fi+a[k]][p.se+b[k]]==false){
					 g=true;
					q.push({p.fi+a[k],p.se+b[k]});
					}
				}
}
			}
   mx=max(mx,cnt-1);
			cnt=0;
		}
	}
}
cout<<mx;

}
