#include <bits/stdc++.h>
using namespace std;
int main() {
  int h;
  int w;
  cin >> h >> w;
  vector<string> s;
  for (int i = 0; i < h; i++) {
    string str;
    cin >> str;
    s.push_back(str);
  }
  int ans = 0;
  for (int a = 0; a < w; a++) {
    for (int b = 0; b < h; b++) {
      if (s[b][a] == '.') {
        int step[21][21];
        for (int i = 0; i < 21; i++) {
          for (int j = 0; j < 21; j++) {
            step[i][j] = 0;
          }
        }
        queue<pair<int, int>> que;
        que.push(pair<int, int>{a, b});
        step[a][b] = 1;
        int vx[] = {0, 1, 0, -1};
        int vy[] = {1, 0, -1, 0};
        while (!que.empty()) {
          pair<int, int> p = que.front();
          que.pop();
          int now_step = step[p.first][p.second];
          for (int i = 0; i < 4; i++) {
            pair<int, int> np;
            np.first = p.first + vx[i];
            np.second = p.second + vy[i];
            if ((0 <= np.first && np.first < w) &&
                (0 <= np.second && np.second < h)) {
              if (s[np.second][np.first] == '.' &&
                  step[np.first][np.second] == 0) {
                que.push(pair<int, int>{np.first, np.second});
                step[np.first][np.second] = now_step + 1;
              }
            }
          }
        }
        for (int c = 0; c < w; c++) {
          for (int d = 0; d < h; d++) {
            if (s[d][c] == '#') break;
            ans = max(ans, step[c][d] - 1);
          }
        }
      }
    }
  }
  cout << ans << endl;
  return 0;
}
