#include <bits/stdc++.h>
using namespace std;
long long mypow(long long a, long long b, long long c) {
  if (b == 0) return 1;
  if (b % 2) return mypow(a, b - 1, c) * a % c;
  long long z = mypow(a, b / 2, c);
  return z * z % c;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
char c[20][20];
signed main() {
  long long a, b, ans = 0;
  cin >> a >> b;
  for (long long i = 0; i < a; i++) {
    for (long long j = 0; j < b; j++) cin >> c[i][j];
  }
  for (long long i = 0; i < a; i++) {
    for (long long j = 0; j < b; j++) {
      if (c[i][j] == '#') continue;
      queue<pair<pair<long long, long long>, long long>> q;
      bool used[20][20] = {};
      q.push({{i, j}, 0});
      used[i][j] = true;
      while (q.size()) {
        pair<pair<long long, long long>, long long> p = q.front();
        q.pop();
        ans = max(ans, p.second);
        if (p.first.first >= 1 && !used[p.first.first - 1][p.first.second] &&
            c[p.first.first - 1][p.first.second] == '.') {
          q.push({{p.first.first - 1, p.first.second}, p.second + 1});
          used[p.first.first - 1][p.first.second] = true;
        }
        if (p.first.second >= 1 && !used[p.first.first][p.first.second - 1] &&
            c[p.first.first][p.first.second - 1] == '.') {
          q.push({{p.first.first, p.first.second - 1}, p.second + 1});
          used[p.first.first][p.first.second - 1] = true;
        }
        if (p.first.first < a - 1 && !used[p.first.first + 1][p.first.second] &&
            c[p.first.first + 1][p.first.second] == '.') {
          q.push({{p.first.first + 1, p.first.second}, p.second + 1});
          used[p.first.first + 1][p.first.second] = true;
        }
        if (p.first.second < a - 1 &&
            !used[p.first.first][p.first.second + 1] &&
            c[p.first.first][p.first.second + 1] == '.') {
          q.push({{p.first.first, p.first.second + 1}, p.second + 1});
          used[p.first.first][p.first.second + 1] = true;
        }
      }
    }
  }
  cout << ans << endl;
}
