#include <bits/stdc++.h>
using namespace std;
long long ans[25][25][25][25];
long long H, W;
char c[25][25];
struct az {
  int x;
  int y;
  int cnt;
} q[1000005];
int main() {
  scanf("%lld%lld", &H, &W);
  for (int i = 1; i <= H; ++i)
    for (int j = 1; j <= W; ++j) scanf(" %c", &c[i][j]);
  for (int i = 1; i <= H; ++i) {
    for (int j = 1; j <= W; ++j) {
      if (c[i][j] == '#') continue;
      int l = 0, r = 1;
      q[1].x = i;
      q[1].y = j;
      q[1].cnt = 0;
      ans[i][j][i][j] = 0;
      while (l < r) {
        ++l;
        int dx = q[l].x;
        int dy = q[l].y;
        int now = q[l].cnt;
        if (dx > 1 && !ans[i][j][dx - 1][dy] && c[dx - 1][dy] != '#') {
          ++r;
          q[r].x = dx - 1;
          q[r].y = dy;
          q[r].cnt = now + 1;
          ans[i][j][dx - 1][dy] = now + 1;
        }
        if (dy > 1 && !ans[i][j][dx][dy - 1] && c[dx][dy - 1] != '#') {
          ++r;
          q[r].x = dx;
          q[r].y = dy - 1;
          q[r].cnt = now + 1;
          ans[i][j][dx][dy - 1] = now + 1;
        }
        if (dx < H && !ans[i][j][dx + 1][dy] && c[dx + 1][dy] != '#') {
          ++r;
          q[r].x = dx + 1;
          q[r].y = dy;
          q[r].cnt = now + 1;
          ans[i][j][dx + 1][dy] = now + 1;
        }
        if (dy < W && !ans[i][j][dx][dy + 1] && c[dx][dy + 1] != '#') {
          ++r;
          q[r].x = dx;
          q[r].y = dy + 1;
          q[r].cnt = now + 1;
          ans[i][j][dx][dy + 1] = now + 1;
        }
      }
    }
  }
  long long sum = 0;
  for (int i = 1; i <= H; ++i)
    for (int j = 1; j <= W; ++j)
      for (int k = 1; k <= H; ++k)
        for (int s = 1; s <= W; ++s) sum = max(sum, ans[i][j][k][s]);
  printf("%lld\n", sum);
  return 0;
}
