#include <bits/stdc++.h>
using namespace std;
int fx[] = {1, 0, -1, 0};
int fy[] = {0, 1, 0, -1};
vector<string> v(50);
int vis[50][50], h, w;
void bfs(int x, int y) {
  int i, gx, gy, xx, yy;
  queue<pair<int, int> > qu;
  qu.push({x, y});
  vis[x][y] = 1;
  while (!qu.empty()) {
    xx = qu.front().first;
    yy = qu.front().second;
    qu.pop();
    for (i = 0; i < 4; i++) {
      gx = xx + fx[i];
      gy = yy + fy[i];
      if (gx >= 0 && gx < h && gy >= 0 && gy < w && vis[gx][gy] == 0 &&
          v[gx][gy] == '.') {
        vis[gx][gy] = vis[xx][yy] + 1;
        qu.push({gx, gy});
      }
    }
  }
}
int main() {
  int i, j, gx, gy, x, y;
  cin >> h >> w;
  for (i = 0; i < h; i++) {
    cin >> v[i];
  }
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      vis[i][j] = 0;
    }
  }
  bool fl = false;
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      if (v[i][j] == '.' && vis[i][j] == 0) {
        bfs(i, j);
      }
    }
  }
  int mx = 0;
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      if (mx < vis[i][j]) {
        mx = vis[i][j];
      }
    }
  }
  vector<pair<int, int> > num;
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      if (mx == vis[i][j]) {
        num.push_back({i, j});
      }
    }
  }
  mx = 0;
  for (int ii = 0; ii < num.size(); ii++) {
    for (i = 0; i < h; i++) {
      for (j = 0; j < w; j++) {
        vis[i][j] = 0;
      }
    }
    bfs(num[ii].first, num[ii].second);
    for (i = 0; i < h; i++) {
      for (j = 0; j < w; j++) {
        mx = max(mx, vis[i][j]);
      }
    }
  }
  cout << mx - 1 << "\n";
  return 0;
}
