#include <cstdio>
struct Coada{int l; int c;int d;};
char a[110][110], c;
int b[110][110];
int n, m, i, j, nr,max;
int dx[]={0, 0, 1};
int dy[]={0, 1, 0};
void LEE(int x, int y)
{
    Coada C[10010], X;
    int ic, sf, l9, c9,k;
    ic=sf=1;
    C[ic].l=x;
    C[ic].c=y;
    C[ic].d=1;
    while(ic<=sf)
    {
        X=C[ic++];
        nr=X.d;
        for(k=1;k<=2;k++)
        {
            l9=X.l+dx[k];
            c9=X.c+dy[k];
            if((a[l9][c9]=='.')&&(!b[l9][c9]))
            {
                C[++sf].l=l9;
                C[sf].c=c9;
                C[sf].d=X.d+1;
                b[l9][c9]=1;
            }
        }
    }
}
void bordare()
{
    int i, j;
    for(i=0;i<=n+1;i++)
        b[i][0]=b[i][m+1]=1;
    for(j=0;j<=m+1;j++)
        b[0][j]=b[n+1][j]=1;
}
void curata()
{
    int i, j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            b[i][j]=0;
}
int main()
{
    scanf("%d%d\n", &n, &m);
    bordare();
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            scanf("%c", &a[i][j]);
        scanf("%c", &c);
    }
    max=0;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            if(a[i][j]=='.')\
            {
                nr=1;
                LEE(i, j);
                if(nr>max) max=nr;
                curata();
            }
        }
    }
    printf("%d\n", max);
    return 0;
}