#include <bits/stdc++.h>
using namespace std;
int h, w, ans;
char s[25][25];
int drr[] = {1, -1, 0, 0};
int drc[] = {0, 0, 1, -1};
int dst[25][25];
pair<int, int> start, End;
bool chk(int i, int j) {
  if (i < 0 || i >= h || j < 0 || j >= w) return 0;
  if (s[i][j] == '#')
    return 0;
  else
    return 1;
}
int bfs() {
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) dst[i][j] = 1e9;
  }
  dst[start.first][start.second] = 0;
  queue<pair<int, int> > qu;
  qu.push(start);
  while (!qu.empty()) {
    pair<int, int> cur = qu.front();
    qu.pop();
    int r = cur.first, c = cur.second;
    for (int i = 0; i < 4; i++) {
      int row = r + drr[i], col = c + drc[i];
      if (chk(row, col)) {
        if (dst[row][col] > dst[r][c] + 1) {
          dst[row][col] = 1 + dst[r][c];
          pair<int, int> to;
          to.first = row;
          to.second = col;
          qu.push(to);
        }
      }
    }
  }
  return dst[End.first][End.second];
}
int main() {
  cin >> h >> w;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) cin >> s[i][j];
  }
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (chk(i, j)) {
        start = make_pair(i, j);
        for (int k = 0; k < h; k++) {
          for (int l = 0; l < w; l++) {
            if (chk(k, l)) {
              End = make_pair(k, l);
            }
            ans = max(ans, bfs());
          }
        }
      }
    }
  }
  cout << ans << endl;
  return 0;
}
