#include <bits/stdc++.h>
#define ALL(v) v.begin(), v.end()
#define MOD 1000000007
#define INF 1000000007
#define rep(i, n) for(int i = 0; i < (int)(n); i++)
#define req(i, j, n) for(int i = j; i <= (int)(n); i++)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;

int h,w;
  char grid[25][25];
 int b[405][25][25];
int sx,sy;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};

int bfs(int t){
  queue<P> que;
  que.push_back(P(sx, sy));
  b[t][sx][sy]=0;
  while(que.size()){
    P p=que.front();
    que.pop();
    int nx=p.first;
    int ny=p.second;
for(int i=0;i<=3;i++){
  int nex=dx[i];
  int ney=dy[i];
  if(b[t][nx+nex][ny+ney]==-1 && grid[t][nx+nex][ny+ney]!='#'){
    que.push(P(nx+nex, ny+ney));
    b[t][nx+nex][ny+ney]=b[t][nx][ny]+1;
  }
}
  }
  return 0;}


int main() {

  cin>>h>>w;

  
    for(int i=0;i<=h+1;i++){
    for(int j=0;j<=w+1;j++){
      grid[i][j]='#';
    }
  }
  
  
  
  for(int i=1;i<=h;i++){
    for(int j=1;j<=w;j++){
      cin>>grid[i][j];
    }
  }
  
 
  for(int i=1;i<=h*w;i++){
    for(int j=0;j<=h+1;j++){
      for(int k=0;k<=w+1;k++){
        b[i][j][k]=-1;
      }
    }
  }
  
  int ans=0;
  int time=0;
  for(int i=1;i<=h;i++){
    for(int j=1;j<=w;j++){
      time++;
      bfs(time)();
  for(int k=1;k<=h;k++){
    for(int l=1;l<=w;l++){
         ans=max(ans,b[t][k][l]);
    }
  }
    }
  }
  
  cout<<ans<<endl;
  
  
  

}
