#include <bits/stdc++.h>
using namespace std;
long long mod = 1000000007;
long long power(long long n, long long k) {
  long long ans = 1;
  while (k) {
    if (k & 1) ans = (ans * n) % mod;
    k /= 2;
    n = (n * n) % mod;
  }
  return ans;
}
bool issafe(int x, int y, int n, int m) {
  if (x < 0 || x >= n) return 0;
  if (y < 0 || y >= m) return 0;
  return 1;
}
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n, m;
  cin >> n >> m;
  string s[n];
  for (int i = 0; i < int(n); i++) cin >> s[i];
  int vis[n][m];
  memset(vis, 0, sizeof(vis));
  int in1 = -1, in2 = -1;
  for (int i = 0; i < int(n); i++) {
    for (int j = 0; j < int(m); j++) {
      if (s[i][j] == '.' && vis[i][j] == 0) {
        vis[i][j] = 1;
        queue<pair<int, int> > que;
        que.push({i, j});
        int ma = 0;
        while (!que.empty()) {
          int r, c;
          r = que.front().first;
          c = que.front().second;
          que.pop();
          for (int k = 0; k < 4; k++) {
            if (issafe(r + dx[k], c + dy[k], n, m) &&
                vis[r + dx[k]][c + dy[k]] == 0 &&
                s[r + dx[k]][c + dy[k]] == '.') {
              vis[r + dx[k]][c + dy[k]] = vis[r][c] + 1;
              que.push({r + dx[k], c + dy[k]});
              if (vis[r + dx[k]][c + dy[k]] > ma) {
                ma = vis[r + dx[k]][c + dy[k]];
                in1 = r + dx[k];
                in2 = c + dy[k];
              }
            }
          }
        }
      }
    }
  }
  int ans = 0;
  memset(vis, 0, sizeof(vis));
  vis[in1][in2] = 1;
  queue<pair<int, int> > que;
  que.push({in1, in2});
  while (!que.empty()) {
    int r, c;
    r = que.front().first;
    c = que.front().second;
    que.pop();
    for (int k = 0; k < 4; k++) {
      if (issafe(r + dx[k], c + dy[k], n, m) &&
          vis[r + dx[k]][c + dy[k]] == 0 && s[r + dx[k]][c + dy[k]] == '.') {
        vis[r + dx[k]][c + dy[k]] = vis[r][c] + 1;
        que.push({r + dx[k], c + dy[k]});
        if (vis[r + dx[k]][c + dy[k]] > ans) {
          ans = vis[r + dx[k]][c + dy[k]];
        }
      }
    }
  }
  if (ans > 0)
    cout << ans - 1;
  else
    cout << 0;
  return 0;
}
