#include <bits/stdc++.h>
struct z {
  int x;
  int y;
};
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int h, w;
char s[27][27];
int main() {
  int i, j, k, r;
  int v[25][25];
  int d[25][25];
  int max = -99;
  char nx, ny;
  char bx, by;
  struct z queue[20000];
  int head = 0;
  int tail = 0;
  scanf("%d %d", &h, &w);
  for (i = 0; i < h; i++) {
    scanf("%s", s[i]);
  }
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      head = 0;
      tail = 0;
      for (k = 0; k < h; k++) {
        for (r = 0; r < w; r++) {
          v[k][r] = 0;
          d[k][r] = -99999;
        }
      }
      if (s[bx][by] == '#') continue;
      bx = i;
      by = j;
      queue[tail].x = bx;
      queue[tail].y = by;
      tail++;
      d[bx][by] = 0;
      while (head != tail) {
        bx = queue[head].x;
        by = queue[head].y;
        head++;
        for (k = 0; k < 4; k++) {
          nx = bx + dx[k];
          ny = by + dy[k];
          if (nx < h && ny < w && nx >= 0 && ny >= 0 && v[nx][ny] == 0 &&
              s[nx][ny] != '#') {
            queue[tail].x = nx;
            queue[tail].y = ny;
            tail++;
            d[nx][ny] = d[bx][by] + 1;
            v[nx][ny] = 1;
          }
        }
      }
      for (k = 0; k < h; k++) {
        for (r = 0; r < w; r++) {
          if (d[k][r] > max) max = d[k][r];
        }
      }
    }
  }
  printf("%d\n", max);
  return 0;
}
