#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll MOD = 1000000007;
int main() {
  int H, W;
  cin >> H >> W;
  vector<vector<char>> S(H + 2, vector<char>(W + 2, '#'));
  for (int i = 1; i <= H; i++) {
    for (int j = 1; j <= W; j++) {
      cin >> S[i][j];
    }
  }
  int ans = 0;
  for (int h = 1; h <= H; h++) {
    for (int w = 1; w <= W; w++) {
      vector<vector<int>> M(H + 2, vector<int>(W + 2, 100000));
      int tmp = 0;
      if (S[h][w] == '.') {
        queue<vector<int>> Q;
        vector<int> x(3, 0);
        x[0] = h;
        x[1] = w;
        x[2] = 0;
        Q.push(x);
        while (Q.empty() == 0) {
          int i = Q.front()[0];
          int j = Q.front()[1];
          int step = Q.front()[2];
          M[i][j] = min(M[i][j], step);
          Q.pop();
          if (S[i - 1][j] == '.' && M[i - 1][j] == 100000) {
            x[0] = i - 1;
            x[1] = j;
            x[2] = step + 1;
            Q.push(x);
          }
          if (S[i + 1][j] == '.' && M[i + 1][j] == 100000) {
            x[0] = i + 1;
            x[1] = j;
            x[2] = step + 1;
            Q.push(x);
          }
          if (S[i][j - 1] == '.' && M[i][j - 1] == 100000) {
            x[0] = i;
            x[1] = j - 1;
            x[2] = step + 1;
            Q.push(x);
          }
          if (S[i][j + 1] == '.' && M[i][j + 1] == 100000) {
            x[0] = i;
            x[1] = j + 1;
            x[2] = step + 1;
            Q.push(x);
          }
        }
        for (int i = 1; i <= H; i++) {
          for (int j = 1; j <= W; j++) {
            if (M[i][j] < 100000) {
              tmp = max(tmp, M[i][j]);
            }
          }
        }
        ans = max(ans, tmp);
      }
    }
  }
  cout << ans << endl;
}
