#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  vector<vector<char>> v(n, vector<char>(m));
  vector<pair<int, int>> klo;
  for (int i = (0); i < (n); i++) {
    for (int j = (0); j < (m); j++) {
      cin >> v[i][j];
      if (v[i][j] == '.') {
        klo.push_back({i, j});
      }
    }
  }
  int zg = klo.size(), maxi = 0;
  for (int i = (0); i < (zg); i++) {
    queue<pair<int, pair<int, int>>> q;
    q.push({1, klo[i]});
    set<pair<int, int>> vis;
    while (!q.empty()) {
      maxi = max(maxi, q.front().first);
      int a = q.front().first, b = q.front().second.first,
          c = q.front().second.second;
      vis.insert({b, c});
      if (!vis.count({b + 1, c}) && b < n - 1 && v[b + 1][c] == '.') {
        q.push({a + 1, {b + 1, c}});
      }
      if (!vis.count({b - 1, c}) && b > 0 && v[b - 1][c] == '.') {
        q.push({a + 1, {b - 1, c}});
      }
      if (!vis.count({b, c + 1}) && c < m - 1 && v[b][c + 1] == '.') {
        q.push({a + 1, {b, c + 1}});
      }
      if (!vis.count({b, c - 1}) && c > 0 && v[b][c - 1] == '.') {
        q.push({a + 1, {b, c - 1}});
      }
      q.pop();
    }
  }
  cout << maxi - 1;
}
