#include <bits/stdc++.h>
using namespace std;
void parseArray(long long* A, long long n) {
  for (long long K = 0; K < n; K++) {
    cin >> A[K];
  }
}
long long modInverse(long long a, long long b) {
  return 1 < a ? b - modInverse(b % a, a) * b / a : 1;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) { return (a * b) / gcd(a, b); }
long double dist(long long x, long long y, long long a, long long b) {
  return sqrt((x - a) * (x - a) + (y - b) * (y - b));
}
void debug(long long* a, long long n) {
  for (int k = 0; k < n; k++) {
    cout << a[k] << " ";
  }
  cerr << "\n";
}
char g[25][25];
long long h, w;
long long bfs(pair<long long, long long> s, pair<long long, long long> d) {
  queue<pair<pair<long long, long long>, long long>> q;
  q.push({s, 0});
  bool vis[25][25];
  memset(vis, 0, sizeof vis);
  vis[s.first][s.second] = true;
  for (int k = 0; k < h; k++)
    for (int j = 0; j < w; j++)
      if (g[k][j] == '#') vis[k][j] = true;
  while (!q.empty()) {
    pair<pair<long long, long long>, long long> p = q.front();
    q.pop();
    if (p.first.first == d.first && p.first.second == d.second) return p.second;
    if (p.first.first - 1 >= 0 &&
        vis[p.first.first - 1][p.first.second] == false) {
      q.push({{p.first.first - 1, p.first.second}, p.second + 1});
      vis[p.first.first - 1][p.first.second] = true;
    }
    if (p.first.first + 1 < h &&
        vis[p.first.first + 1][p.first.second] == false) {
      q.push({{p.first.first + 1, p.first.second}, p.second + 1});
      vis[p.first.first + 1][p.first.second] = true;
    }
    if (p.first.second - 1 >= 0 &&
        vis[p.first.first][p.first.second - 1] == false) {
      q.push({{p.first.first, p.first.second - 1}, p.second + 1});
      vis[p.first.first][p.first.second - 1] = true;
    }
    if (p.first.second + 1 < w &&
        vis[p.first.first][p.first.second + 1] == false) {
      q.push({{p.first.first, p.first.second + 1}, p.second + 1});
      vis[p.first.first][p.first.second + 1] = true;
    }
  }
  return -1;
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  ;
  cin >> h >> w;
  for (int k = 0; k < h; k++) cin >> g[k];
  long long ans = 0;
  for (int k = 0; k < h; k++) {
    for (int j = 0; j < w; j++) {
      for (int i = 0; i < h; i++) {
        for (int l = 0; l < w; l++) {
          long long x = bfs({k, j}, {i, l});
          ans = max(ans, x);
        }
      }
    }
  }
  cout << ans << endl;
  return 0;
}
