#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  vector<vector<char>> v(n, vector<char>(m));
  vector<pair<int, int>> klo;
  for (int i = (0); i < (n); i++) {
    for (int j = (0); j < (m); j++) {
      cin >> v[i][j];
      if (v[i][j] == '.') {
        klo.push_back({i, j});
      }
    }
  }
  int zg = klo.size(), maxi = 0;
  if (zg == m * n) {
    cout << m + n - 2;
    return 0;
  }
  queue<pair<int, pair<int, int>>> q;
  q.push({0, klo[0]});
  set<pair<int, int>> vis;
  pair<int, int> temp;
  while (!q.empty()) {
    if (maxi < q.front().first) {
      maxi = max(maxi, q.front().first);
      temp = q.front().second;
    }
    int a = q.front().first, b = q.front().second.first,
        c = q.front().second.second;
    vis.insert({b, c});
    if (!vis.count({b + 1, c}) && b < n - 1 && v[b + 1][c] == '.') {
      q.push({a + 1, {b + 1, c}});
    }
    if (!vis.count({b - 1, c}) && b > 0 && v[b - 1][c] == '.') {
      q.push({a + 1, {b - 1, c}});
    }
    if (!vis.count({b, c + 1}) && c < m - 1 && v[b][c + 1] == '.') {
      q.push({a + 1, {b, c + 1}});
    }
    if (!vis.count({b, c - 1}) && c > 0 && v[b][c - 1] == '.') {
      q.push({a + 1, {b, c - 1}});
    }
    q.pop();
  }
  vis.clear();
  q.push({0, temp});
  while (!q.empty()) {
    if (maxi < q.front().first) {
      maxi = max(maxi, q.front().first);
    }
    int a = q.front().first, b = q.front().second.first,
        c = q.front().second.second;
    vis.insert({b, c});
    if (!vis.count({b + 1, c}) && b < n - 1 && v[b + 1][c] == '.') {
      q.push({a + 1, {b + 1, c}});
    }
    if (!vis.count({b - 1, c}) && b > 0 && v[b - 1][c] == '.') {
      q.push({a + 1, {b - 1, c}});
    }
    if (!vis.count({b, c + 1}) && c < m - 1 && v[b][c + 1] == '.') {
      q.push({a + 1, {b, c + 1}});
    }
    if (!vis.count({b, c - 1}) && c > 0 && v[b][c - 1] == '.') {
      q.push({a + 1, {b, c - 1}});
    }
    q.pop();
  }
  cout << maxi;
}
