#include <bits/stdc++.h>
using namespace std;
using lli = long long int;
template <class T>
ostream &operator<<(ostream &o, const vector<T> &v) {
  o << "{";
  for (int i = 0; i < (int)v.size(); i++) o << (i > 0 ? ", " : "") << v[i];
  o << "}";
  return o;
}
template <class T>
ostream &operator<<(ostream &o, const pair<T, T> &p) {
  o << "(" << p.first << ", " << p.second << ")";
  return o;
}
const lli MOD = 1000000007LL;
lli modpow(lli a, lli n) {
  lli res = 1;
  for (lli ai = a; n; n >>= 1) {
    if (1 & n) res = (res * ai) % MOD;
    ai = (ai * ai) % MOD;
  }
  return res;
}
lli inv(lli n) { return modpow(n, MOD - 2); }
lli modperm(lli n, lli k) {
  lli res = 1;
  for (lli i = 0; i < (lli)(k); i++) {
    res = (res * (n - i)) % MOD;
  }
  return res;
}
lli modcomb(lli n, lli k) { return (modperm(n, k) * inv(modperm(k, k))) % MOD; }
lli posmod(lli n) {
  lli res = n;
  res %= MOD;
  if (res < 0) res += MOD;
  return res;
}
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
int h, w;
char maze[20][20];
int depth[20][20];
void init() {
  for (lli i = 0; i < (lli)(h); i++) {
    for (lli j = 0; j < (lli)(w); j++) {
      depth[i][j] = -1;
    }
  }
}
void bfs(int x, int y) {
  queue<pair<int, int>> q;
  if (x < 0 || x >= h || y < 0 || y >= w || maze[x][y] == '#') return;
  q.push(make_pair(x, y));
  depth[x][y] = 0;
  while (!q.empty()) {
    x = q.front().first;
    y = q.front().second;
    q.pop();
    for (lli i = 0; i < (lli)(4); i++) {
      int nx = x + dx[i];
      int ny = y + dy[i];
      if (nx < 0 || nx >= h || ny < 0 || ny >= w || maze[nx][ny] == '#')
        continue;
      if (depth[nx][ny] == -1) {
        depth[nx][ny] = depth[x][y] + 1;
        q.push(make_pair(nx, ny));
      }
    }
  }
}
int main(void) {
  cin >> h >> w;
  for (lli i = 0; i < (lli)(h); i++) {
    for (lli j = 0; j < (lli)(w); j++) {
      cin >> maze[i][j];
    }
  }
  init();
  for (lli i = 0; i < (lli)(h); i++) {
    for (lli j = 0; j < (lli)(w); j++) {
      if (maze[i][j] != '#') {
        bfs(i, j);
        break;
      }
    }
  }
  int md = -1;
  pair<int, int> p(0, 0);
  for (lli i = 0; i < (lli)(h); i++) {
    for (lli j = 0; j < (lli)(w); j++) {
      if (md < depth[i][j]) {
        md = depth[i][j];
        p = make_pair(i, j);
      }
    }
  }
  init();
  bfs(p.first, p.second);
  for (lli i = 0; i < (lli)(h); i++) {
    for (lli j = 0; j < (lli)(w); j++) {
      md = max(md, depth[i][j]);
    }
  }
  cout << max(md, 0) << endl;
  return 0;
}
