#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
long long n, m;
string a[20];
long long vis[20][20];
bool check(long long i, long long j) {
  if (i >= 0 && i < n && j >= 0 && j < m)
    return true;
  else {
    return false;
  }
}
bool safe(long long i, long long j) {
  if (a[i][j] == '#' || vis[i][j]) return false;
  return true;
}
long long ma = 0, mi = 10000000001;
void find(long long i, long long j, long long k, long long l, long long dis) {
  if (a[i][j] == '#') {
    return;
  }
  if (i == k && j == l) {
    if (mi > dis) {
      mi = dis;
    }
  }
  vis[i][j] = 1;
  if (check(i + 1, j) && safe(i + 1, j)) find(i + 1, j, k, l, dis + 1);
  if (check(i - 1, j) && safe(i - 1, j)) find(i - 1, j, k, l, dis + 1);
  if (check(i, j + 1) && safe(i, j + 1)) find(i, j + 1, k, l, dis + 1);
  if (check(i, j - 1) && safe(i, j - 1)) find(i, j - 1, k, l, dis + 1);
  vis[i][j] = 0;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long i, j, k, l;
  cin >> n >> m;
  for (i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      for (k = i + 1; k < n; k++) {
        for (l = j + 1; l < m; l++) {
          mi = 10000000001;
          memset(vis, 0, sizeof(vis));
          if (a[i][j] == '.' && a[k][l] == '.') {
            find(i, j, k, l, 0);
            ma = max(mi, ma);
          }
        }
      }
    }
  }
  cout << ma;
}
