#include <bits/stdc++.h>
using namespace std;
int main() {
  int h, w;
  cin >> h >> w;
  int i, j;
  char s[20][20];
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      cin >> s[i][j];
    }
  }
  char p[20][20];
  queue<pair<int, int>> que;
  pair<int, int> start;
  int maxl = 0;
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      memset(p, -1, sizeof(p));
      if (s[i][j] == '.') {
        p[i][j] = 0;
        que.push(pair<int, int>(i, j));
        while (que.size()) {
          start = que.front();
          que.pop();
          if (start.first > 0) {
            if (s[start.first - 1][start.second] == '.') {
              if (p[start.first - 1][start.second] == -1) {
                que.push(pair<int, int>(start.first - 1, start.second));
                p[start.first - 1][start.second] =
                    p[start.first][start.second] + 1;
                if (p[start.first - 1][start.second] > maxl)
                  maxl = p[start.first - 1][start.second];
              }
            }
          }
          if (start.first < h - 1) {
            if (s[start.first + 1][start.second] == '.') {
              if (p[start.first + 1][start.second] == -1) {
                que.push(pair<int, int>(start.first + 1, start.second));
                p[start.first + 1][start.second] =
                    p[start.first][start.second] + 1;
                if (p[start.first + 1][start.second] > maxl)
                  maxl = p[start.first + 1][start.second];
              }
            }
          }
          if (start.second > 0) {
            if (s[start.first][start.second - 1] == '.') {
              if (p[start.first][start.second - 1] == -1) {
                que.push(pair<int, int>(start.first, start.second - 1));
                p[start.first][start.second - 1] =
                    p[start.first][start.second] + 1;
                if (p[start.first][start.second - 1] > maxl)
                  maxl = p[start.first][start.second - 1];
              }
            }
          }
          if (start.second < w - 1) {
            if (s[start.first][start.second + 1] == '.') {
              if (p[start.first][start.second + 1] == -1) {
                que.push(pair<int, int>(start.first, start.second + 1));
                p[start.first][start.second + 1] =
                    p[start.first][start.second] + 1;
                if (p[start.first][start.second + 1] > maxl)
                  maxl = p[start.first][start.second + 1];
              }
            }
          }
        }
      }
    }
  }
  cout << maxl << endl;
  return 0;
}
