#include <bits/stdc++.h>
using namespace std;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int H, W;
vector<string> board;
long long bfs(int i, int j) {
  vector<string> visited(board.size());
  copy(board.begin(), board.end(), visited.begin());
  queue<pair<int, int> > que;
  queue<int> dist;
  visited[i][j] = '#';
  for (int k = 0; k < (4); k++) {
    pair<int, int> next = pair<int, int>(i + dx[k], j + dy[k]);
    if (next.first >= 0 && next.first < H && next.second >= 0 &&
        next.second < W && visited[next.first][next.second] == '.') {
      que.push(next);
      dist.push(1);
    }
  }
  long long d;
  while (!que.empty()) {
    pair<int, int> cur = que.front();
    que.pop();
    d = dist.front();
    dist.pop();
    visited[cur.first][cur.second] = '#';
    for (int k = 0; k < (4); k++) {
      pair<int, int> cur_n =
          pair<int, int>(cur.first + dx[k], cur.second + dy[k]);
      if (cur_n.first >= 0 && cur_n.first < H && cur_n.second >= 0 &&
          cur_n.second < W && visited[cur_n.first][cur_n.second] == '.') {
        que.push(cur_n);
        dist.push(d + 1);
      }
    }
  }
  return d;
}
int main(int argc, char const *argv[]) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> H >> W;
  for (int i = 0; i < (H); i++) {
    string s;
    cin >> s;
    board.push_back(s);
  }
  long long res = 0;
  for (int i = 0; i < (H); i++) {
    for (int j = 0; j < (W); j++) {
      if (board[i][j] == '.') res = max(res, bfs(i, j));
    }
  }
  cout << res << endl;
  return 0;
}
