#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > g;
vector<int> dist;
vector<bool> used;
int N;
void bfs(const int &start) {
  dist.clear();
  used.clear();
  queue<int> q;
  q.push(start);
  while (q.empty() == 0) {
    int cur = q.front();
    q.pop();
    used[cur] = 1;
    for (int &to : g[cur])
      if (!used[to]) {
        q.push(to);
        dist[to] = dist[cur] + 1;
      }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  vector<string> a(n);
  for (string &i : a) cin >> i;
  N = n * m;
  g.resize(N);
  used.resize(N);
  dist.resize(N);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (a[i][j] == '.') {
        if (i > 0 && a[i - 1][j] == '.')
          g[i * m + j].push_back((i - 1) * m + j);
        if (i < n - 1 && a[i + 1][j] == '.')
          g[i * m + j].push_back((i + 1) * m + j);
        if (j > 0 && a[i][j - 1] == '.') g[i * m + j].push_back(i * m + j - 1);
        if (j < n - 1 && a[i][j + 1] == '.')
          g[i * m + j].push_back(i * m + j + 1);
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < N; i++) {
    bfs(i);
    for (int j = 0; j < N; j++) {
      ans = max(ans, abs(dist[i] - dist[j]));
    }
  }
  cout << ans << endl;
  return 0;
}
