#include <bits/stdc++.h>
using namespace std;
int dfs(vector<vector<char>> map, int h, int w, int i, int j, int length) {
  vector<vector<int>> d{{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
  queue<vector<int>> q;
  vector<int> node(3);
  int v = 0, bv = 1, buf = 0, max = 0;
  map[i][j] = 'f';
  node[0] = i;
  node[1] = j;
  node[2] = 0;
  q.push(node);
  while (!q.empty()) {
    node = q.front();
    q.pop();
    buf = 0;
    for (int k = 0; k < 4; k++) {
      vector<int> new_node(3);
      int dx = d[k][0], dy = d[k][1];
      if (map[node[0] + dy][node[1] + dx] == '.') {
        map[node[0] + dy][node[1] + dx] = 'f';
        new_node[0] = node[0] + dy;
        new_node[1] = node[1] + dx;
        new_node[2] = node[2] + 1;
        q.push(new_node);
        if (max < new_node[2]) max = new_node[2];
      }
    }
  }
  return max;
}
int main(void) {
  int h, w, buf;
  int max = 0;
  cin >> h >> w;
  h += 2;
  w += 2;
  vector<vector<char>> map(h, vector<char>(w, 0));
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (i == 0 || j == 0 || i == h - 1 || j == w - 1)
        map[i][j] = '#';
      else
        cin >> map[i][j];
      cout << map[i][j];
    }
    cout << endl;
  }
  for (int i = 1; i < h - 1; i++) {
    for (int j = 1; j < w - 1; j++) {
      if (map[i][j] == '.') {
        buf = dfs(map, h, w, i, j, 0);
        if (max < buf) max = buf;
      }
    }
  }
  cout << max << endl;
}
