#include <bits/stdc++.h>
using namespace std;
bool vis[25][25];
long long dis[25][25];
long long n, m;
char mat[25][25];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
long long bfs(long long x, long long y) {
  memset(vis, 0, sizeof vis);
  memset(dis, 0, sizeof dis);
  long long ans = 0;
  vis[x][y] = 1;
  queue<pair<long long, long long>> q;
  q.push({x, y});
  while (!q.empty()) {
    long long px = q.front().first;
    long long py = q.front().second;
    q.pop();
    for (int i = 0; i < 4; i++) {
      long long nx = px + dx[i];
      long long ny = py + dy[i];
      if (nx >= 0 && ny >= 0 && nx < n && ny < m) {
        if (!vis[nx][ny] && mat[nx][ny] != '#') {
          vis[nx][ny] = 1;
          dis[nx][ny] = 1 + dis[px][py];
          ans = max(ans, dis[nx][ny]);
          q.push({nx, ny});
        }
      }
    }
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(NULL);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> mat[i];
  }
  long long ans = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      ans = max(ans, bfs(i, j));
    }
  }
  cout << ans << endl;
  return 0;
}
