#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<string> grid;
vector<vector<ll>> ans;
ll h,w;
ll a=0;
void f(ll x,ll y,ll d){
    if(ans[x][y]<=d)return;
    ans[x][y]=d;
    if(x>0){
        if(grid[x-1][y]=='.')f(x-1,y,d+1);
    }
      if(y>0){
        if(grid[x][y-1]=='.')f(x,y-1,d+1);
    }
      if(x<h-1){
        if(grid[x+1][y]=='.')f(x+1,y,d+1);
    }
      if(y<w-1){
        if(grid[x][y+1]=='.')f(x,y+1,d+1);
    }
}

int main(){
    cin>>h>>w;
    grid.resize(h);
	for (int z=0;z<h;z++)cin >> grid[z];
    for(int i=0;i<h;i++){
    for(int j=0;j<w;j++){
        if(grid[i][j]=='.'){
            ans.resize(0);
            ans.resize(h,vector<long long>(w,LLONG_MAX));
            f(i,j,0);
            for(int x=0;x<h;x++){
            for(int y=0;y<w;y++)if(ans[x][y]!=LLONG_MAX)a=max(ans[x][y],a);
        }}
    }}
    cout<<a;
}