#include <bits/stdc++.h>
using namespace std;
int h, w;
vector<vector<char>> s;
vector<vector<int>> sb;
vector<int> dx = {-1, 0, 1, 0};
vector<int> dy = {0, -1, 0, 1};
struct xydata {
  int x, y;
};
int bfs(int sx, int sy, int gx, int gy) {
  sb = vector<vector<int>>(h, vector<int>(w, 1000));
  xydata first;
  first.x = sx;
  first.y = sy;
  queue<xydata> que;
  que.push(first);
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      sb.at(i).at(j) = 1000;
    }
  }
  sb.at(first.y).at(first.x) = 0;
  while (!que.empty()) {
    xydata now = que.front();
    que.pop();
    if (now.x == gx && now.y == gy) {
      break;
    }
    for (int i = 0; i < 4; ++i) {
      xydata next;
      next.x = now.x + dx.at(i);
      next.y = now.y + dy.at(i);
      if (next.x >= 0 && next.x < w && next.y >= 0 && next.y < h) {
        if (s.at(next.y).at(next.x) == '.') {
          if (sb.at(now.y).at(now.x) + 1 <= sb.at(next.y).at(next.x)) {
            sb.at(next.y).at(next.x) = sb.at(now.y).at(now.x) + 1;
            que.push(next);
          }
        }
      }
    }
  }
  return sb.at(gy).at(gx);
}
int main() {
  cin >> h >> w;
  s = vector<vector<char>>(h, vector<char>(w, '.'));
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      cin >> s.at(i).at(j);
    }
  }
  int maxlen = 0;
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      if (s.at(i).at(j) == '.') {
        for (int k = 0; k < h; ++k) {
          for (int l = 0; l < w; ++l) {
            if (i != k || j != l) {
              if (s.at(k).at(l) == '.') {
                int len = bfs(j, i, l, k);
                maxlen = max(maxlen, len);
              }
            }
          }
        }
      }
    }
  }
  cout << maxlen << endl;
}
