#include <bits/stdc++.h>
using namespace std;
constexpr long long gcd(long long a, long long b) {
  return b ? gcd(b, a % b) : a;
}
constexpr long long lcm(long long a, long long b) { return a * b / gcd(a, b); }
char a[40][40];
bool f[40][40];
int n, m;
int bfs(int x, int y) {
  f[x][y] = false;
  int res = 0;
  if (a[x + 1][y] != '#' && f[x + 1][y] && x + 1 < m)
    res = max(res, bfs(x + 1, y));
  if (a[x - 1][y] != '#' && f[x - 1][y] && x - 1 >= 0)
    res = max(res, bfs(x - 1, y));
  if (a[x][y + 1] != '#' && f[x][y + 1] && y + 1 < n)
    res = max(res, bfs(x, y + 1));
  if (a[x][y - 1] != '#' && f[x][y - 1] && y - 1 >= 0)
    res = max(res, bfs(x, y - 1));
  return res + 1;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 0; i < int(n); i++)
    for (int j = 0; j < int(m); j++) cin >> a[i][j];
  int ans = 0;
  for (int i = 0; i < int(n); i++)
    for (int j = 0; j < int(m); j++) {
      if (a[i][j] == '.') {
        memset(f, 1, sizeof(f));
        ans = max(ans, bfs(i, j));
      }
    }
  cout << ans / 2 << endl;
  return 0;
}
