#include <bits/stdc++.h>
using namespace std;
int main() {
  int h, w;
  cin >> h >> w;
  vector<string> s(h);
  vector<vector<int> > flag(h, vector<int>(w, 0));
  for (long long int i = 0; i < h; i++) {
    cin >> s[i];
  }
  queue<pair<long long int, long long int> > que;
  map<pair<long long int, long long int>, long long int> m;
  int tmp_f = 0;
  for (long long int i = 0; i < h; i++) {
    for (long long int j = 0; j < w; j++) {
      if (s[i][j] == '.') {
        que.push(make_pair(i, j));
        flag[i][j] = 1;
        tmp_f = 1;
      }
      if (tmp_f == 1) break;
    }
    if (tmp_f == 1) break;
  }
  pair<long long int, long long int> tmp;
  pair<long long int, long long int> last;
  int d1[2] = {-1, 1};
  while (!que.empty()) {
    tmp = que.front();
    que.pop();
    for (long long int i = 0; i < 2; i++) {
      if (tmp.first + d1[i] >= 0 && tmp.first + d1[i] < h) {
        if (s[tmp.first + d1[i]][tmp.second] == '.' &&
            flag[tmp.first + d1[i]][tmp.second] == 0) {
          flag[tmp.first + d1[i]][tmp.second] = 1;
          que.push(make_pair(tmp.first + d1[i], tmp.second));
        }
      }
      if (tmp.second + d1[i] >= 0 && tmp.second + d1[i] < w) {
        if (s[tmp.first][tmp.second + d1[i]] == '.' &&
            flag[tmp.first][tmp.second + d1[i]] == 0) {
          flag[tmp.first][tmp.second + d1[i]] = 1;
          que.push(make_pair(tmp.first, tmp.second + d1[i]));
        }
      }
    }
    if (que.empty()) {
      last = tmp;
      break;
    }
  }
  m[last] = 0;
  que.push(last);
  for (long long int i = 0; i < h; i++) fill(flag[i].begin(), flag[i].end(), 0);
  flag[last.first][last.second] = 1;
  while (!que.empty()) {
    tmp = que.front();
    que.pop();
    for (long long int i = 0; i < 2; i++) {
      if (tmp.first + d1[i] >= 0 && tmp.first + d1[i] < h) {
        if (s[tmp.first + d1[i]][tmp.second] == '.' &&
            flag[tmp.first + d1[i]][tmp.second] == 0) {
          flag[tmp.first + d1[i]][tmp.second] = 1;
          que.push(make_pair(tmp.first + d1[i], tmp.second));
          m[make_pair(tmp.first + d1[i], tmp.second)] =
              m[make_pair(tmp.first, tmp.second)] + 1;
        }
      }
      if (tmp.second + d1[i] >= 0 && tmp.second + d1[i] < w) {
        if (s[tmp.first][tmp.second + d1[i]] == '.' &&
            flag[tmp.first][tmp.second + d1[i]] == 0) {
          flag[tmp.first][tmp.second + d1[i]] = 1;
          que.push(make_pair(tmp.first, tmp.second + d1[i]));
          m[make_pair(tmp.first, tmp.second + d1[i])] =
              m[make_pair(tmp.first, tmp.second)] + 1;
        }
      }
    }
    if (que.empty()) {
      last = tmp;
      break;
    }
  }
  long long int ans = m[last];
  for (long long int i = 0; i < h; i++) {
    for (long long int j = 0; j < w; j++) {
      if (ans < m[make_pair(i, j)]) {
        ans = m[make_pair(i, j)];
      }
    }
  }
  cout << m[last] << endl;
  return 0;
}
