#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
int encode(pii a, int w) { return a.first * w + a.second; }
pii decode(int a, int w) {
  pii res;
  res.first = a / w;
  res.second = a - res.first * w;
  return res;
}
inline bool valid(int i, int j, int h, int w) {
  return 0 <= i && i < h && 0 <= j && j < w;
}
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
int main() {
  int h, w;
  cin >> h >> w;
  vector<string> map(h);
  for (int i = 0; i < h; i++) {
    cin >> map[i];
  }
  vector<vector<int>> dis(h * w, vector<int>(h * w, 1 << 28));
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (map[i][j] == '.') {
        for (int k = 0; k < 4; k++) {
          int ni = i + dx[k];
          int nj = j + dy[k];
          if (valid(ni, nj, h, w)) {
            if (map[ni][nj] == '.') {
              dis[encode(pii(i, j), w)][encode(pii(ni, nj), w)] = 1;
              dis[encode(pii(ni, nj), w)][encode(pii(i, j), w)] = 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++) {
        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < h * w; i++) {
    for (int j = 0; j < h * w; j++) {
      pii p = decode(i, w);
      pii n = decode(j, w);
      if (map[p.first][p.second] == '.' && map[n.first][n.second] == '.') {
        ans = max(ans, dis[i][j]);
      }
    }
  }
  cout << ans << endl;
}
