#include <bits/stdc++.h>
using namespace std;
char g[30][30];
bool vis[30][30] = {false};
int h, w;
void reset() {
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      vis[i][j] = false;
    }
  }
}
void bfs(int x, int y, int& ans) {
  queue<pair<pair<int, int>, int>> q;
  q.push({{x, y}, 0});
  while (!q.empty()) {
    int x = q.front().first.first, y = q.front().first.second;
    int lev = q.front().second;
    q.pop();
    if (vis[x][y]) continue;
    vis[x][y] = true;
    ans = max(ans, lev);
    if (x - 1 >= 0 && g[x - 1][y] == '.') {
      q.push({{x - 1, y}, lev + 1});
    }
    if (x + 1 < w && g[x + 1][y] == '.') {
      q.push({{x + 1, y}, lev + 1});
    }
    if (y - 1 >= 0 && g[x][y - 1] == '.') {
      q.push({{x, y - 1}, lev + 1});
    }
    if (y + 1 < h && g[x][y + 1] == '.') {
      q.push({{x, y + 1}, lev + 1});
    }
  }
}
int main() {
  cin >> h >> w;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> g[i][j];
    }
  }
  int ans = 0;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (g[i][j] == '#') continue;
      reset();
      bfs(i, j, ans);
    }
  }
  cout << ans << endl;
}
