#include <bits/stdc++.h>
using namespace std;
using namespace std;
const int ma = 1e5 + 5;
int h, w;
char arr[25][25];
int bfs(int p, int q) {
  vector<vector<int> > dis(h);
  for (int i = 0; i < h; i++) {
    dis[i].resize(w);
    for (int j = 0; j < w; j++) dis[i][j] = 0;
  }
  queue<pair<int, int> > Q;
  Q.push({p, q});
  int mx = -1;
  while (!Q.empty()) {
    pair<int, int> pt = Q.front();
    Q.pop();
    if (pt.first - 1 >= 0 && dis[pt.first - 1][pt.second] == 0 &&
        arr[pt.first - 1][pt.second] == '.') {
      dis[pt.first - 1][pt.second] = dis[pt.first][pt.second] + 1;
      Q.push({pt.first - 1, pt.second});
      mx = max(mx, dis[pt.first - 1][pt.second]);
    }
    if (pt.first + 1 < h && dis[pt.first + 1][pt.second] == 0 &&
        arr[pt.first + 1][pt.second] == '.') {
      dis[pt.first + 1][pt.second] = dis[pt.first][pt.second] + 1;
      Q.push(make_pair(pt.first + 1, pt.second));
      mx = max(mx, dis[pt.first + 1][pt.second]);
    }
    if (pt.second - 1 >= 0 && dis[pt.first][pt.second - 1] == 0 &&
        arr[pt.first][pt.second - 1] == '.') {
      dis[pt.first][pt.second - 1] = dis[pt.first][pt.second] + 1;
      Q.push({pt.first, pt.second - 1});
      mx = max(mx, dis[pt.first][pt.second - 1]);
    }
    if (pt.second + 1 < w && dis[pt.first][pt.second + 1] == 0 &&
        arr[pt.first][pt.second + 1] == '.') {
      dis[pt.first][pt.second + 1] = dis[pt.first][pt.second] + 1;
      Q.push({pt.first, pt.second + 1});
      mx = max(mx, dis[pt.first][pt.second + 1]);
    }
  }
  return mx;
}
int main() {
  cin >> h >> w;
  int mx = 0;
  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++) cin >> arr[i][j];
  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++) {
      if (arr[i][j] == '.') mx = max(mx, bfs(i, j));
    }
  cout << mx << endl;
  return 0;
}
