#include <bits/stdc++.h>
using namespace std;
using ll = long long;
bool map[22][22] = {true};
int dis[22][22] = {0};
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
bool visit[22][22];
void getDis(int i, int j) {
  visit[i][j] = true;
  for (int(k) = (0); (k) < (4); (k)++) {
    if (map[i + dy[k]][j + dx[k]] == true) {
      dis[i + dy[k]][j + dx[k]] = dis[i + dy[k]][j + dx[k]] > dis[i][j] + 1
                                      ? dis[i][j] + 1
                                      : dis[i + dy[k]][j + dx[k]];
      if (!visit[i + dy[k]][j + dx[k]]) {
        getDis(i + dy[k], j + dx[k]);
      }
    }
  }
  visit[i][j] = false;
}
int main() {
  int h, w;
  cin >> h >> w;
  string str;
  int ans = 0;
  int tmp = 0;
  for (int(i) = (0); (i) < (22); (i)++) {
    for (int(j) = (0); (j) < (22); (j)++) {
      map[i][j] = true;
    }
  }
  for (int(i) = (0); (i) < (22); (i)++) {
    map[i][0] = false;
    map[i][21] = false;
    map[0][i] = false;
    map[0][21] = false;
  }
  for (int(i) = (0); (i) < (w + 1); (i)++) {
    map[h + 1][i] = false;
  }
  for (int(j) = (0); (j) < (h + 1); (j)++) {
    map[j][w + 1] = false;
  }
  map[h + 1][w + 1] = false;
  for (int(i) = (0); (i) < (h); (i)++) {
    cin >> str;
    for (int(j) = (0); (j) < (w); (j)++) {
      if (str[j] == '#') map[i + 1][j + 1] = false;
    }
  }
  for (int(i) = (1); (i) < (h + 1); (i)++) {
    for (int(j) = (1); (j) < (w + 1); (j)++) {
      if (map[i][j] == false) {
        continue;
      }
      for (int(k) = (1); (k) < (21); (k)++) {
        for (int(l) = (1); (l) < (21); (l)++) {
          dis[k][l] = 1e9;
          visit[k][j] = false;
        }
      }
      dis[i][j] = 0;
      visit[i][j] = true;
      tmp = 0;
      getDis(i, j);
      for (int(k) = (1); (k) < (h + 1); (k)++) {
        for (int(j) = (1); (j) < (w + 1); (j)++) {
          if (map[k][j] == true && dis[k][j] != 1e9) tmp = max(tmp, dis[k][j]);
        }
      }
      ans = max(ans, tmp);
    }
  }
  cout << ans << endl;
  return 0;
}
