#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
vector<string> lis;
int ma = 0;
int h, w;
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, 1, -1};
struct zahyo {
  int x;
  int y;
};
void solve(int x, int y) {
  vector<vector<int> > flag(h, vector<int>(w, -1));
  flag[x][y] = 0;
  queue<zahyo> q;
  q.push({x, y});
  while (!q.empty()) {
    zahyo z = q.front();
    q.pop();
    for (int i = (0), i_len = (4); i < i_len; ++i) {
      int nx = z.x + dx[i];
      int ny = z.y + dy[i];
      if ((nx >= 0) && (ny >= 0) && (nx < h) && (ny < w)) {
        if (lis[nx][ny] == '.' && flag[nx][ny] == -1) {
          flag[nx][ny] = flag[z.x][z.y] + 1;
          q.push({nx, ny});
          ma = max(ma, flag[nx][ny]);
        }
      }
    }
  }
}
int main() {
  cin >> h >> w;
  lis = vector<string>(h);
  for (int i = (0), i_len = (h); i < i_len; ++i) {
    cin >> lis[i];
  }
  for (int i = (0), i_len = (h); i < i_len; ++i) {
    for (int l = (0), l_len = (w); l < l_len; ++l) {
      solve(i, l);
    }
  }
  cout << ma << endl;
}
