#include <bits/stdc++.h>
int di[] = {-1, 0, 1, 0};
int dj[] = {0, 1, 0, -1};
char cc[20][20 + 1];
int n, m;
int bfs(int i1, int j1, int i2, int j2) {
  static int dd[20][20], qu[20 * 20];
  int i, i_, j, j_, ij, d, h, head, cnt;
  head = cnt = 0;
  for (i = 0; i < n; i++)
    for (j = 0; j < m; j++) dd[i][j] = n * m + 1;
  dd[i1][j1] = 0;
  qu[head + cnt++] = i1 * m + j1;
  while (cnt > 0) {
    ij = qu[head++];
    cnt--;
    i = ij / m;
    j = ij % m;
    d = dd[i][j] + 1;
    if (i == i2 && j == j2) return dd[i][j];
    for (h = 0; h < 4; h++) {
      i_ = i + di[h];
      j_ = j + dj[h];
      if (i_ >= 0 && i_ < n && j_ >= 0 && j_ < m && cc[i_][j_] == '.' &&
          dd[i_][j_] > d) {
        dd[i_][j_] = d;
        qu[head + cnt++] = i_ * m + j_;
      }
    }
  }
  return -1;
}
int main() {
  int i, i1, j1, i2, j2, x, ans;
  scanf("%d%d", &n, &m);
  for (i = 0; i < n; i++) scanf("%s", cc[i]);
  ans = 0;
  for (i1 = 0; i1 < n; i1++)
    for (j1 = 0; j1 < m; j1++)
      for (i2 = 0; i2 < n; i2++)
        for (j2 = 0; j2 < m; j2++) {
          x = bfs(i1, j1, i2, j2);
          if (ans < x) ans = x;
        }
  printf("%d\n", ans);
  return 0;
}
