#include <bits/stdc++.h>
using namespace std;
int gi() {
  int a;
  scanf("%d", &a);
  return a;
}
long long gli() {
  long long a;
  scanf("%lld", &a);
  return a;
}
int d[400][400];
char g[20][24];
int m;
int gt(int x, int y) { return x * m + y; }
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n = gi();
  m = gi();
  memset(d, 1, sizeof(d));
  for (int i = 0; i < n; i++) scanf("%s", g[i]);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (g[i][j] == '.') {
        int x = gt(i, j);
        if (i && g[i - 1][j] == '.') {
          int y = gt(i - 1, j);
          d[x][y] = 1;
          d[y][x] = 1;
        }
        if (j && g[i][j - 1] == '.') {
          int y = gt(i, j - 1);
          d[x][y] = 1;
          d[y][x] = 1;
        }
        if (i < n - 1 && g[i + 1][j] == '.') {
          int y = gt(i + 1, j);
          d[x][y] = 1;
          d[y][x] = 1;
        }
        if (j < m - 1 && g[i][j + 1] == '.') {
          int y = gt(i, j + 1);
          d[x][y] = 1;
          d[y][x] = 1;
        }
      }
  int t = n * m;
  for (int k = 0; k < t; k++)
    for (int i = 0; i < t; i++)
      for (int j = 0; j < t; j++)
        if (d[i][j] > d[i][k] + d[k][j]) d[i][j] = d[i][k] + d[k][j];
  int r = -1;
  for (int i = 0; i < t; i++)
    for (int j = 0; j < t; j++)
      if (d[i][j] < 500 && d[i][j] > r) r = d[i][j];
  printf("%d\n", r);
  return 0;
}
