#include <bits/stdc++.h>
using namespace std;
#define F first  
#define S second
#define ll long long
#define pb push_back
#define pr pair<ll,ll>

const ll N=1e5+9,mod=1e9+7,inf=1e18;

int r,c,vis[22][22];
string s[22];



int bfs(int i,int j)
{
	queue< pair<pair<int,int>,int> > q;
	q.push({ {i,j},0});
	int mx=0;
	vis[i][j]=true;
	while(!q.empty())
	{
		auto p=q.front();
		q.pop();
        if(s[p.F.F][p.F.S]=='#')continue;
        mx=max(mx,p.S);
        if( !vis[p.F.F][p.F.S+1])  
        	{
        		vis[p.F.F][p.F.S+1]=true;
        		q.push(  {  {p.F.F,p.F.S+1} ,p.S+1} )
        	}
        if( !vis[p.F.F][p.F.S-1]) 
        {
        	vis[p.F.F][p.F.S-1]=true;
          q.push(  {  {p.F.F,p.F.S-1} ,p.S+1} )
        } 
         if( !vis[p.F.F+1][p.F.S])
         {
         	vis[p.F.F+1][p.F.S]=true;
         	 q.push(  {  {p.F.F+1,p.F.S} ,p.S+1} )
         } 
         if( !vis[p.F.F-1][p.F.S]) 
         	{
         		vis[p.F.F-1][p.F.S]=true;
         		 q.push(  {  {p.F.F-1,p.F.S} ,p.S+1} )
         	}

	}
	return mx;
}

int main()
{
	cin>>r>>c;
	for(int i=0;i<=c+1;i++)
	{
		s[0].pb('#');
		s[r+1].pb('#')
	}
    for(int i=1;i<=r;i++)
    {
    	cin>>s[i];
    	s[i]="#"+s[i]+"#";
    }
    int mx=0;

    for(int i=1;i<=r;i++)
    {
    	for(int j=1;j<=c;j++)
    	{
    		
    		memset(vis,0,sizeof vis);
    		mx=max(mx,bfs(i,j));
    	}
    }

    cout<<mx<<"\n";
	
	
	return 0;
}
