#include <bits/stdc++.h>
using namespace std;
const int nmax = 22;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int d[nmax + 2][nmax + 2];
char s[nmax + 2][nmax + 2];
void dfs(int p, int q) {
  queue<pair<int, int>> qu;
  for (int i = 1; i <= nmax; i++) {
    for (int j = 1; j <= nmax; j++) {
      d[i][j] = 1e9;
    }
  }
  d[p][q] = 0;
  qu.push(make_pair(p, q));
  while (!qu.empty()) {
    pair<int, int> r = qu.front();
    qu.pop();
    int u = r.first, v = r.second;
    if (s[u][v] == '#') {
      continue;
    }
    for (int i = 0; i < 4; i++) {
      for (int j = 0; j < 4; j++) {
        int x = u + dx[i], y = v + dy[i];
        if (d[x][y] > d[u][v] + 1 && s[x][v] == '.') {
          d[x][y] = d[u][v] + 1;
          qu.push(make_pair(x, y));
        }
      }
    }
  }
}
int main() {
  int h, w;
  cin >> h >> w;
  for (int i = 0; i <= h + 1; i++) {
    for (int j = 0; j <= w + 1; j++) {
      if (i >= 1 && i <= h && j >= 1 && j <= w) {
        cin >> s[i][j];
      } else {
        s[i][j] = '#';
      }
    }
  }
  int ans = 0;
  for (int i = 1; i <= h; i++) {
    for (int j = 1; j <= w; j++) {
      dfs(i, j);
      if (s[i][j] == '.') {
        for (int k = 1; k <= h; k++) {
          for (int l = 1; l <= w; l++) {
            ans = max(ans, d[k][l]);
          }
        }
      }
    }
  }
  cout << ans << endl;
}
