#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define all(v) v.begin(), v.end()
using in = int64_t;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define REP(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
const double PI=3.14159265358979323846;
const in MOD = 1000000007;
const in INF=1<<30;
#define vec2(a,y,x) vector<vector<int>> a(y,vector<int>(x,0))
#define vec1(a,n) vector<int> a(n);rep(i,n)cin>>a[i]
using P=pair<int,int>;
vector<int> dx={0,1,-1,0};
vector<int> dy={1,0,0,-1};

int main(){
  ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  int h,w,x,y,nx,ny;
  cin>>h>>w;
  vector<vector<char>> a(h,vector<char>(w));
  rep(i,h)rep(j,w) cin>>a[i][j];
  
  int ans=0;
  rep(i,h)rep(j,w){//strart:(i,j)
     if(a[i][j]=='#') continue;
    queue<P> q;
    vec2(seen,h,w);
    q.push(P(i,j));
    while(q.size()){
    	x=q.front().second;y=q.front.first;
      rep(k,4){
        nx=x+dx[k];ny=y+dy[k];
      	if(nx<0 || ny<0 || nx>=w || ny>=h || a[ny][nx]=='#') continue;
        seen[ny][nx]=seen[x][y]+1;
      }
    }
    ans =max(ans,seen[ny][nx]);
  }
  cout<<ans<<endl;
}
