using namespace std;

#include<iomanip>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<utility>
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<numeric>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<deque>

const int INFI=(1LL<<30)-100;
const long long INFL=(1LL<<62)-100;
const double eps=1e-10;
const long double pi=acos(-1.0);
const int MAXN=110;

char a[MAXN][MAXN];
int ds[MAXN][MAXN];

int main(){
    //freopen("date.in","r",stdin);
    //freopen("date.out","w",stdout);

    int n,m;
    scanf("%d%d",&n,&m);
    scanf("%*c");

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%c",&a[i][j]);
        }
        scanf("%*c");
    }


    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(!ds[i][j]){
                ds[i][j]=1;
                queue<pair<int,int> > q;
                q.push(make_pair(i,j));

                int ve[2][2]={{1,0},{0,1}};

                #define vi i+ve[t][0]
                #define vj j+ve[t][1]

                while(!q.empty()){
                    int i=q.front().first;
                    int j=q.front().second;
                    q.pop();

                    for(int t=0;t<2;t++){
                        if(a[vi][vj]=='.' && ds[vi][vj]<ds[i][j]+1){
                            ds[vi][vj]=ds[i][j]+1;
                            q.push(make_pair(vi,vj));
                        }
                    }
                }
            }
        }
    }

    int mx=0;

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            mx=max(mx,ds[i][j]);
        }
    }

    printf("%d",mx);

    return 0;
}