#include <bits/stdc++.h>
using namespace std;
vector<vector<char>> A;
set<pair<int, int>> Vis;
int ans = -2147483647, maxi = -2147483647;
void bfs(int a, int b, int aa, int bb) {
  queue<pair<pair<int, int>, int>> B;
  B.push({{a, b}, 0});
  while (!B.empty()) {
    a = B.front().first.first;
    b = B.front().first.second;
    int k = B.front().second;
    if (a == aa && b == bb) {
      maxi = k;
      break;
    }
    Vis.insert({a, b});
    B.pop();
    if (A[a + 1][b] == '.' && !Vis.count({a + 1, b})) {
      B.push({{a + 1, b}, k + 1});
      Vis.insert({a + 1, b});
    }
    if (A[a - 1][b] == '.' && !Vis.count({a - 1, b})) {
      B.push({{a - 1, b}, k + 1});
      Vis.insert({a - 1, b});
    }
    if (A[a][b + 1] == '.' && !Vis.count({a, b + 1})) {
      B.push({{a, b + 1}, k + 1});
      Vis.insert({a, b + 1});
    }
    if (A[a][b - 1] == '.' && !Vis.count({a, b - 1})) {
      B.push({{a, b - 1}, k + 1});
      Vis.insert({a, b - 1});
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, m;
  cin >> n >> m;
  A.resize(n + 2, vector<char>(m + 2, '#'));
  for (int i = 1; i < n + 1; i++) {
    for (int j = 1; j < m + 1; j++) {
      cin >> A[i][j];
    }
  }
  for (int i = 1; i < n + 1; i++) {
    for (int j = 1; j < m + 1; j++) {
      if (A[i][j] != '.') {
        continue;
      }
      for (int ii = 1; ii < n + 1; ii++) {
        for (int jj = 1; jj < m + 1; jj++) {
          if (A[ii][jj] != '.') {
            continue;
          }
          maxi = -2147483647;
          bfs(i, j, ii, jj);
          ans = max(ans, maxi);
          Vis.clear();
        }
      }
    }
  }
  cout << ans;
}
