#include <bits/stdc++.h>
using namespace std;

int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
vector<string> maze(30);

struct P {
  int y,x;
};

int bfs(int y,int x) {
  int cnt=0;
  vector<vector<int>> d(30,vector<int>(30,-1));
  queue<P> q;
  q.push({y,x});
  d[y][x]=0;
  P now,next;
  while(!q.empty()) {
    now=q.front(); q.pop();
    for(int i=0;i<4;i++) {
      next={now.y+dy[i],now.x+dx[i]};
      if(d[next.y][next.x]==-1&&maze[next.y][next.x]!='#') {
        d[next.y][next.x]=d[now.y][now.x]+1;
        cnt=max(cnt,d[next.y][next.x]);
        q.push(next);
      }
    }
  }
  return cnt;
}


int main() {
  int h,w; cin>>h>>w;
  int ans=0;

  for(int i=0;i<=w+1;i++) {
    maze[0]+='#';
    maze[h+1]+='#';
  }
  for(int i=1;i<=h;i++) {
    string m; cin>>m;
    maze[i]='#'+m+'#';
  }

  for(int i=1;i<=h;i++) {
    for(int j=1;j<=w;j++) {
      if(maze[i][j]=='.') {
        ans=max(ans,bfs(i,j));
      }
    }
  }

  cout<<ans<<endl;
}
