#include <bits/stdc++.h>
using namespace std;
int main() {
  int h, w;
  cin >> h >> w;
  vector<vector<char>> p(h + 5, vector<char>(w + 5));
  for (int i = 1; i < h + 1; i++) {
    for (int j = 1; j < w + 1; j++) cin >> p[i][j];
  }
  bool f[25][25] = {};
  int r[25][25] = {};
  int cnt = 0;
  int ans = 0;
  while (cnt < w * h) {
    int X = 0, Y = 0;
    bool F = 0;
    for (int i = 1; i < h + 1; i++) {
      for (int j = 1; j < w + 1; j++) {
        if (F) break;
        if (!f[i][j]) cnt++;
        f[i][j] = 1;
        if (p[i][j] == '.') {
          X = i;
          Y = j;
          F = 1;
          break;
        }
      }
      if (F) break;
    }
    queue<int> c, d;
    vector<int> T;
    if (!f[X + 1][Y] && p[X + 1][Y] == '.') {
      c.push(X + 1), d.push(Y), r[X + 1][Y] = max(r[X + 1][Y], r[X][Y] + 1);
      int t = 0;
      while (c.size()) {
        int x = c.front(), y = d.front();
        f[x][y] = 1;
        t = max(t, r[x][y]);
        if (!f[x + 1][y] && p[x + 1][y] == '.') {
          c.push(x + 1), d.push(y), r[x + 1][y] = max(r[x + 1][y], r[x][y] + 1);
        }
        if (!f[x - 1][y] && p[x - 1][y] == '.')
          c.push(x - 1), d.push(y), r[x - 1][y] = max(r[x - 1][y], r[x][y] + 1);
        if (!f[x][y + 1] && p[x][y + 1] == '.')
          c.push(x), d.push(y + 1), r[x][y + 1] = max(r[x][y + 1], r[x][y] + 1);
        if (!f[x][y - 1] && p[x][y - 1] == '.')
          c.push(x), d.push(y - 1), r[x][y - 1] = max(r[x][y - 1], r[x][y] + 1);
        if (!f[x + 1][y]) cnt++;
        if (!f[x - 1][y]) cnt++;
        if (!f[x][y + 1]) cnt++;
        if (!f[x][y - 1]) cnt++;
        f[x + 1][y] = 1;
        f[x - 1][y] = 1;
        f[x][y + 1] = 1;
        f[x][y - 1] = 1;
        c.pop(), d.pop();
      }
      T.push_back(t);
    }
    if (!f[X - 1][Y] && p[X - 1][Y] == '.') {
      c.push(X - 1), d.push(Y), r[X - 1][Y] = max(r[X - 1][Y], r[X][Y] + 1);
      int t = 0;
      while (c.size()) {
        int x = c.front(), y = d.front();
        t = max(t, r[x][y]);
        if (!f[x + 1][y] && p[x + 1][y] == '.') {
          c.push(x + 1), d.push(y), r[x + 1][y] = max(r[x + 1][y], r[x][y] + 1);
        }
        if (!f[x - 1][y] && p[x - 1][y] == '.')
          c.push(x - 1), d.push(y), r[x - 1][y] = max(r[x - 1][y], r[x][y] + 1);
        if (!f[x][y + 1] && p[x][y + 1] == '.')
          c.push(x), d.push(y + 1), r[x][y + 1] = max(r[x][y + 1], r[x][y] + 1);
        if (!f[x][y - 1] && p[x][y - 1] == '.')
          c.push(x), d.push(y - 1), r[x][y - 1] = max(r[x][y - 1], r[x][y] + 1);
        if (!f[x + 1][y]) cnt++;
        if (!f[x - 1][y]) cnt++;
        if (!f[x][y + 1]) cnt++;
        if (!f[x][y - 1]) cnt++;
        f[x + 1][y] = 1;
        f[x - 1][y] = 1;
        f[x][y + 1] = 1;
        f[x][y - 1] = 1;
        c.pop(), d.pop();
      }
      T.push_back(t);
    }
    if (!f[X][Y + 1] && p[X][Y + 1] == '.') {
      c.push(X), d.push(Y + 1), r[X][Y + 1] = max(r[X][Y + 1], r[X][Y] + 1);
      int t = 0;
      while (c.size()) {
        int x = c.front(), y = d.front();
        t = max(t, r[x][y]);
        if (!f[x + 1][y] && p[x + 1][y] == '.') {
          c.push(x + 1), d.push(y), r[x + 1][y] = max(r[x + 1][y], r[x][y] + 1);
        }
        if (!f[x - 1][y] && p[x - 1][y] == '.')
          c.push(x - 1), d.push(y), r[x - 1][y] = max(r[x - 1][y], r[x][y] + 1);
        if (!f[x][y + 1] && p[x][y + 1] == '.')
          c.push(x), d.push(y + 1), r[x][y + 1] = max(r[x][y + 1], r[x][y] + 1);
        if (!f[x][y - 1] && p[x][y - 1] == '.')
          c.push(x), d.push(y - 1), r[x][y - 1] = max(r[x][y - 1], r[x][y] + 1);
        if (!f[x + 1][y]) cnt++;
        if (!f[x - 1][y]) cnt++;
        if (!f[x][y + 1]) cnt++;
        if (!f[x][y - 1]) cnt++;
        f[x + 1][y] = 1;
        f[x - 1][y] = 1;
        f[x][y + 1] = 1;
        f[x][y - 1] = 1;
        c.pop(), d.pop();
      }
      T.push_back(t);
    }
    if (!f[X][Y - 1] && p[X][Y - 1] == '.') {
      c.push(X), d.push(Y - 1), r[X][Y - 1] = max(r[X][Y - 1], r[X][Y] + 1);
      int t = 0;
      while (c.size()) {
        int x = c.front(), y = d.front();
        t = max(t, r[x][y]);
        if (!f[x + 1][y] && p[x + 1][y] == '.') {
          c.push(x + 1), d.push(y), r[x + 1][y] = max(r[x + 1][y], r[x][y] + 1);
        }
        if (!f[x - 1][y] && p[x - 1][y] == '.')
          c.push(x - 1), d.push(y), r[x - 1][y] = max(r[x - 1][y], r[x][y] + 1);
        if (!f[x][y + 1] && p[x][y + 1] == '.')
          c.push(x), d.push(y + 1), r[x][y + 1] = max(r[x][y + 1], r[x][y] + 1);
        if (!f[x][y - 1] && p[x][y - 1] == '.')
          c.push(x), d.push(y - 1), r[x][y - 1] = max(r[x][y - 1], r[x][y] + 1);
        if (!f[x + 1][y]) cnt++;
        if (!f[x - 1][y]) cnt++;
        if (!f[x][y + 1]) cnt++;
        if (!f[x][y - 1]) cnt++;
        f[x + 1][y] = 1;
        f[x - 1][y] = 1;
        f[x][y + 1] = 1;
        f[x][y - 1] = 1;
        c.pop(), d.pop();
      }
      T.push_back(t);
    }
    sort(T.rbegin(), T.rend());
    if (T.size() > 1)
      ans = max(T[0] + T[1], ans);
    else
      ans = max(ans, T[0]);
  }
  cout << ans << endl;
  return 0;
}
