#include <bits/stdc++.h>
using namespace std;
struct tt {
  int sx, sy, ss;
};
struct tst {
  int ssx, ssy;
};
int s[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
int n, m, ans = 0;
char a[25][25];
int b[25][25] = {0};
void dfs(int x, int y, int z) {
  int i;
  queue<tt> p;
  tt st;
  st.sx = x;
  st.sy = y;
  st.ss = z;
  p.push(st);
  while (!p.empty()) {
    tt sst, h;
    sst = p.front();
    p.pop();
    for (i = 0; i < 4; i++) {
      h.sx = sst.sx + s[i][0];
      h.sy = sst.sy + s[i][1];
      h.ss = sst.ss + 1;
      if (h.sy >= 0 && h.sx >= 0 && h.sx < n && h.sy < m &&
          a[h.sx][h.sy] == '.' && b[h.sx][h.sy] == 0) {
        p.push(h);
        b[h.sx][h.sy] = h.ss;
        if (h.ss > ans) ans = h.ss;
      }
    }
  }
}
void dfss(int x, int y) {
  int i;
  queue<tst> q;
  tst a1;
  a1.ssx = x;
  a1.ssy = y;
  q.push(a1);
  while (!q.empty()) {
    tst a2, a3;
    a3 = q.front();
    q.pop();
    for (i = 0; i < 4; i++) {
      a2.ssx = a3.ssx + s[i][0];
      a2.ssy = a3.ssy + s[i][1];
      if (a2.ssx >= 0 && a2.ssy >= 0 && a2.ssx < n && a2.ssy < m &&
          a[a2.ssx][a2.ssy] == '.' && b[a2.ssx][a2.ssy] != 0) {
        q.push(a2);
        b[a2.ssx][a2.ssy] = 0;
      }
    }
  }
}
int main() {
  int i, j;
  scanf("%d %d", &n, &m);
  for (i = 0; i < n; i++) {
    scanf("%s", a[i]);
  }
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      if (a[i][j] == '.' && b[i][j] == 0) {
        dfs(i, j, 0);
        dfss(i, j);
      }
    }
  }
  printf("%d", ans);
}
