#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n, m;
  cin >> n >> m;
  vector<string> ch(n);
  for (int i = 0; i < n; i++) cin >> ch[i];
  queue<int> map;
  int ans = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (ch[i][j] == '#') continue;
      map.push(i);
      map.push(j);
      map.push(0);
      vector<string> c = ch;
      int Cost = 0;
      while (1) {
        if (map.size() == 0) break;
        int x = map.front();
        map.pop();
        int y = map.front();
        map.pop();
        int cost = map.front();
        map.pop();
        Cost = max(Cost, cost);
        c[x][y] = '#';
        if (x != 0) {
          if (c[x - 1][y] == '.') {
            map.push(x - 1);
            map.push(y);
            map.push(cost + 1);
          }
        }
        if (y != 0) {
          if (c[x][y - 1] == '.') {
            map.push(x);
            map.push(y - 1);
            map.push(cost + 1);
          }
        }
        if (x != n - 1) {
          if (c[x + 1][y] == '.') {
            map.push(x + 1);
            map.push(y);
            map.push(cost + 1);
          }
        }
        if (y != m - 1) {
          if (c[x][y + 1] == '.') {
            map.push(x);
            map.push(y + 1);
            map.push(cost + 1);
          }
        }
      }
      ans = max(ans, Cost);
    }
  }
  cout << ans << endl;
  return 0;
}
