#include <bits/stdc++.h>
using namespace std;
char maze[20][20];
int d1[20][20];
int d2[20][20];
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
const int MAX = 10000;
int H, W;
pair<int, int> bfs(int a, int b) {
  queue<pair<int, int> > Q;
  Q.push(make_pair(a, b));
  d1[a][b] = 0;
  int x = a;
  int y = b;
  int z = 0;
  while (!Q.empty()) {
    pair<int, int> p = Q.front();
    Q.pop();
    for (int i = 0; i < (4); ++i) {
      if (p.first + dx[i] >= 0 && p.first + dx[i] < H &&
          p.second + dy[i] >= 0 && p.second + dy[i] < W &&
          maze[p.first + dx[i]][p.second + dy[i]] == '.' &&
          d1[p.first + dx[i]][p.second + dy[i]] == MAX) {
        d1[p.first + dx[i]][p.second + dy[i]] = d1[p.first][p.second] + 1;
        Q.push(make_pair(p.first + dx[i], p.second + dy[i]));
        x = p.first + dx[i];
        y = p.second + dy[i];
        z = d1[x][y];
      }
    }
  }
  return make_pair(x, y);
}
int main() {
  cin >> H >> W;
  for (int i = 0; i < (H); ++i) {
    for (int j = 0; j < (W); ++j) {
      cin >> maze[i][j];
      d1[i][j] = MAX;
    }
  }
  int a, b;
  bool ch = false;
  for (int i = 0; i < (H); ++i) {
    for (int j = 0; j < (W); ++j) {
      if (maze[i][j] == '.') {
        a = i;
        b = j;
        ch = true;
        break;
      }
    }
    if (ch) break;
  }
  pair<int, int> p = bfs(a, b);
  for (int i = 0; i < (H); ++i) {
    for (int j = 0; j < (W); ++j) {
      d1[i][j] = MAX;
    }
  }
  p = bfs(p.first, p.second);
  cout << d1[p.first][p.second] << endl;
  return 0;
}
