#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
typedef long long ll;

int n,m,d[25][25],Ans;
char s[25][25];
const int dx[]={-1,1,0,0},dy[]={0,0,-1,1};

void BFS(int sx,int sy)
{
    memset(d,0,sizeof d);
    std::queue<int> qx,qy;
    qx.push(sx),qy.push(sy);
    d[sx][sy]=1;
    while(!qx.empty())
    {
        int nx=qx.front(),ny=qy.front();
        qx.pop(),qy.pop();
        for(int i=0;i<4;++i)
        {
            int wx=nx+dx[i],wy=ny+dy[i];
            if(wx<1||wx>n||wy<1||wy>m||s[wx][wy]=='#')continue;
            if(!d[wx][wy])d[wx][wy]=d[nx][ny]+1,qx.push(wx),qy.push(wy);
        }
    }
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            if(d[i][j])
                Ans=std::max(Ans,d[i][j]-1);
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)scanf("%s",s[i]+1);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            if(s[i][j]=='.')
                BFS(i,j);
    printf("%d\n",Ans);
    return 0;
}
