#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
using Graph = vector<vector<int>>;
long long int gcd(long long int a, long long int b) {
  return b ? gcd(b, a % b) : a;
}
long long int lcm(long long int a, long long int b) {
  return a / gcd(a, b) * b;
}
int h, w;
char s[22][22];
int d[22][22];
int main() {
  cin >> h >> w;
  for (int i = 0; i < (h); ++i) {
    for (int j = 0; j < (w); ++j) {
      cin >> s[i][j];
    }
  }
  queue<pair<int, int>> que;
  int ans = 0;
  for (int sh = 0; sh < (h); ++sh) {
    for (int sw = 0; sw < (w); ++sw) {
      for (int i = 0; i < (h); ++i) {
        for (int j = 0; j < (w); ++j) {
          d[i][j] = -1;
        }
      }
      que.push(make_pair(sh, sw));
      d[sh][sw] = 0;
      while (!que.empty()) {
        pair<int, int> now = que.front();
        que.pop();
        int nh = now.first, nw = now.second;
        if (s[nh][nw + 1] == '.' && d[nh][nw + 1] == -1) {
          d[nh][nw + 1] = d[nh][nw] + 1;
          que.push(make_pair(nh, nw + 1));
        }
        if (s[nh][nw - 1] == '.' && d[nh][nw - 1] == -1) {
          d[nh][nw - 1] = d[nh][nw] + 1;
          que.push(make_pair(nh, nw - 1));
        }
        if (s[nh + 1][nw] == '.' && d[nh + 1][nw] == -1) {
          d[nh + 1][nw] = d[nh][nw] + 1;
          que.push(make_pair(nh + 1, nw));
        }
        if (s[nh - 1][nw] == '.' && d[nh - 1][nw] == -1) {
          d[nh - 1][nw] = d[nh][nw] + 1;
          que.push(make_pair(nh - 1, nw));
        }
      }
      int mx = 0;
      for (int i = 0; i < (h); ++i) {
        for (int j = 0; j < (w); ++j) {
          mx = max(mx, d[i][j]);
        }
      }
      ans = max(ans, mx);
    }
  }
  cout << ans << endl;
  return 0;
}
