#include <bits/stdc++.h>
using namespace std;
long long N, M, H, W, K, Q, A, B;
string S, T;
const long long MOD = (1e+9) + 7;
const long long INF = 1LL << 60;
template <class T>
bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  } else
    return false;
}
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  } else
    return false;
}
int main() {
  cin >> H >> W;
  vector<string> ma(H);
  for (int i = 0; i < H; i++) cin >> ma[i];
  vector<vector<long long> > dist(H * W, vector<long long>(H * W, INF));
  vector<long long> di = {-1, 0, 1, 0}, dj = {0, -1, 0, 1};
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      for (int k = 0; k < 4; k++) {
        int ni = i + di[k], nj = j + dj[k];
        if (ni >= 0 && ni < H && nj >= 0 && nj < W) {
          if (ma[i][j] != '#' && ma[ni][nj] != '#') {
            dist[i * W + j][ni * W + nj] = dist[ni * W + nj][i * W + j] = 1;
          }
        }
      }
    }
  }
  for (int k = 0; k < H * W; k++) {
    for (int i = 0; i < H * W; i++) {
      for (int j = 0; j < H * W; j++) {
        chmin(dist[i][j], dist[i][k] + dist[k][j]);
      }
    }
  }
  long long ans = 0;
  for (int i = 0; i < H * W; i++) {
    for (int j = 0; j < H * W; j++) {
      if (dist[i][j] != INF) {
        chmax(ans, dist[i][j]);
      }
    }
  }
  cout << ans << endl;
}
