#include <bits/stdc++.h>
int min[10] = {9999999, 9999999, 9999999, 9999999, 9999999, 999999};
int c[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int n, m, maxx = 0;
char s1[100][100], s2[100][100], s3[100][100], s4[100][100], s5[100][100],
    s6[100][100];
void dfs1(int x, int y, int step) {
  int i, xn, yn;
  if (x == n - 1 && y == m - 1) {
    if (step < min[1]) min[1] = step;
    return;
  }
  for (i = 0; i < 4; i++) {
    xn = x + c[i][0];
    yn = y + c[i][1];
    if (xn < 0 || xn >= n || yn < 0 || yn >= m) {
      continue;
    }
    if (s1[xn][yn] == '.') {
      s1[xn][yn] = 1;
      dfs1(xn, yn, step + 1);
      s1[xn][yn] = '.';
    }
  }
  return;
}
void dfs2(int x, int y, int step) {
  int i, xn, yn;
  if (x == n - 1 && y == 0) {
    if (step < min[2]) min[2] = step;
    return;
  }
  for (i = 0; i < 4; i++) {
    xn = x + c[i][0];
    yn = y + c[i][1];
    if (xn < 0 || xn >= n || yn < 0 || yn >= m) {
      continue;
    }
    if (s2[xn][yn] == '.') {
      s2[xn][yn] = 1;
      dfs2(xn, yn, step + 1);
      s2[xn][yn] = '.';
    }
  }
  return;
}
void dfs3(int x, int y, int step) {
  int i, xn, yn;
  if (x == 0 && y == m - 1) {
    if (step < min[3]) min[3] = step;
    return;
  }
  for (i = 0; i < 4; i++) {
    xn = x + c[i][0];
    yn = y + c[i][1];
    if (xn < 0 || xn >= n || yn < 0 || yn >= m) {
      continue;
    }
    if (s3[xn][yn] == '.') {
      s3[xn][yn] = 1;
      dfs3(xn, yn, step + 1);
      s3[xn][yn] = '.';
    }
  }
  return;
}
void dfs4(int x, int y, int step) {
  int i, xn, yn;
  if (x == 0 && y == m - 1) {
    if (step < min[4]) min[4] = step;
    return;
  }
  for (i = 0; i < 4; i++) {
    xn = x + c[i][0];
    yn = y + c[i][1];
    if (xn < 0 || xn >= n || yn < 0 || yn >= m) {
      continue;
    }
    if (s4[xn][yn] == '.') {
      s4[xn][yn] = 1;
      dfs4(xn, yn, step + 1);
      s4[xn][yn] = '.';
    }
  }
  return;
}
void dfs5(int x, int y, int step) {
  int i, xn, yn;
  if (x == n - 1 && y == m - 1) {
    if (step < min[5]) min[5] = step;
    return;
  }
  for (i = 0; i < 4; i++) {
    xn = x + c[i][0];
    yn = y + c[i][1];
    if (xn < 0 || xn >= n || yn < 0 || yn >= m) {
      continue;
    }
    if (s5[xn][yn] == '.') {
      s5[xn][yn] = 1;
      dfs5(xn, yn, step + 1);
      s5[xn][yn] = '.';
    }
  }
  return;
}
void dfs6(int x, int y, int step) {
  int i, xn, yn;
  if (x == n - 1 && y == m - 1) {
    if (step < min[6]) min[6] = step;
    return;
  }
  for (i = 0; i < 4; i++) {
    xn = x + c[i][0];
    yn = y + c[i][1];
    if (xn < 0 || xn >= n || yn < 0 || yn >= m) {
      continue;
    }
    if (s6[xn][yn] == '.') {
      s6[xn][yn] = 1;
      dfs6(xn, yn, step + 1);
      s6[xn][yn] = '.';
    }
  }
  return;
}
int main() {
  int i, j;
  scanf("%d %d", &n, &m);
  for (i = 0; i < n; i++) {
    getchar();
    for (j = 0; j < m; j++) {
      scanf("%c", &s1[i][j]);
      s2[i][j] = s1[i][j];
      s3[i][j] = s1[i][j];
      s4[i][j] = s1[i][j];
      s5[i][j] = s1[i][j];
      s6[i][j] = s1[i][j];
    }
  }
  dfs1(0, 0, 0);
  dfs2(0, 0, 0);
  dfs3(0, 0, 0);
  dfs4(n - 1, 0, 0);
  dfs5(n - 1, 0, 0);
  dfs6(0, m - 1, 0);
  for (i = 1; i <= 6; i++) {
    if (maxx < min[i]) maxx = min[i];
  }
  printf("%d\n", maxx);
}
