#include <bits/stdc++.h>
using namespace std;
const long long N = 200030;
const long long mod = 1e9 + 7;
int h, w;
string s[25];
bool valid(int x, int y) {
  if (x >= 0 && x < h && y >= 0 && y < w) return true;
  return false;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> h >> w;
  for (__typeof(h) i = (0) - ((0) > (h)); i != (h) - ((0) > (h));
       i += 1 - 2 * ((0) > (h)))
    cin >> s[i];
  int mx = 0;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (s[i][j] == '.') {
        bool bo[30][30];
        memset(bo, false, sizeof(bo));
        queue<pair<int, int> > q;
        q.push({i, j});
        q.push({-1, -1});
        int cnt = 0;
        while (!q.empty()) {
          pair<int, int> p;
          p = q.front();
          q.pop();
          if (p.first == -1) {
            cnt++;
            if (q.size() == 0) break;
            q.push({-1, -1});
          } else {
            bo[p.first][p.second] = true;
            int a[4] = {-1, 0, 1, 0};
            int b[4] = {0, -1, 0, 1};
            bool g = false;
            for (int k = 0; k < 4; k++) {
              if (valid(p.first + a[k], p.second + b[k]) &&
                  s[p.first + a[k]][p.second + b[k]] != '#')
                if (bo[p.first + a[k]][p.second + b[k]] == false) {
                  g = true;
                  q.push({p.first + a[k], p.second + b[k]});
                }
            }
          }
        }
        mx = max(mx, cnt - 1);
        cnt = 0;
      }
    }
  }
  cout << mx;
}
