#include <bits/stdc++.h>
using namespace std;
template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  fill((T *)array, (T *)(array + N), val);
}
template <class T>
inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
const long long INF = 1ll << 60;
const long long MOD = 1000000007;
double EPS = 1e-10;
long long H, W;
char S[25][25];
int main() {
  cin >> H >> W;
  for (int64_t i = 1; i < H + 1; i++) {
    for (int64_t j = 1; j < W + 1; j++) {
      cin >> S[i][j];
    }
  }
  long long d[H * W][H * W];
  for (int64_t i = 1; i < H + 1; i++) {
    for (int64_t j = 1; j < W + 1; j++) {
      if (S[i][j] == '#') {
      } else {
        if (i > 1 && S[i - 1][j] != '#') {
          d[W * (i - 1) + (j - 1)][W * (i - 2) + (j - 1)] = 1;
          d[W * (i - 2) + (j - 1)][W * (i - 1) + (j - 1)] = 1;
        }
        if (i < H && S[i + 1][j] != '#') {
          d[W * (i - 1) + (j - 1)][W * i + (j - 1)] = 1;
          d[W * i + (j - 1)][W * (i - 1) + (j - 1)] = 1;
        }
        if (j > 1 && S[i][j - 1] != '#') {
          d[W * (i - 1) + (j - 1)][W * (i - 1) + (j - 2)] = 1;
          d[W * (i - 1) + (j - 2)][W * (i - 1) + (j - 1)] = 1;
        }
        if (j < W && S[i][j + 1] != '#') {
          d[W * (i - 1) + (j - 1)][W * (i - 1) + j] = 1;
          d[W * (i - 1) + j][W * (i - 1) + (j - 1)] = 1;
        }
      }
    }
  }
  for (int64_t i = 0; i < H * W; i++) {
    for (int64_t j = 0; j < H * W; j++) {
      if (i == j)
        d[i][j] = 0;
      else {
        if (d[i][j] != 1) {
          d[i][j] = INF;
        }
      }
    }
  }
  for (int64_t k = 0; k < H * W; k++) {
    for (int64_t i = 0; i < H * W; i++) {
      for (int64_t j = 0; j < H * W; j++) {
        chmin(d[i][j], d[i][k] + d[k][j]);
      }
    }
  }
  for (int64_t k = 0; k < H * W; k++) {
    for (int64_t i = 0; i < H * W; i++) {
      for (int64_t j = 0; j < H * W; j++) {
        chmin(d[i][j], d[i][k] + d[k][j]);
      }
    }
  }
  long long ans = 0;
  for (int64_t i = 0; i < H * W; i++) {
    for (int64_t j = 0; j < H * W; j++) {
      if (ans < d[i][j] && d[i][j] != INF) ans = d[i][j];
    }
  }
  cout << ans << endl;
  return 0;
}
