#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, y, f, d;
};
node st;
node mid;
node fr;
char a[1010][1010];
int used[1010][1010][4];
int fx[4] = {1, -1, 0, 0};
int fy[4] = {0, 0, -1, 1};
deque<node> q;
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) cin >> a[i][j];
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      for (int k = 0; k < 4; k++) used[i][j][k] = (1 << 29);
  st.x = n;
  st.y = m;
  st.f = 2;
  st.d = 0;
  used[n][m][2] = 0;
  q.push_front(st);
  while (!q.empty()) {
    fr = q.front();
    q.pop_front();
    if (fr.x == 1 && fr.y == 1 && fr.f == 2) {
      cout << fr.d;
      return 0;
    }
    int nx = fr.x + fx[fr.f];
    int ny = fr.y + fy[fr.f];
    if (nx > 0 && nx <= n && ny > 0 && ny <= m) {
      if (used[nx][ny][fr.f] > fr.d) {
        used[nx][ny][fr.f] = fr.d;
        mid.x = nx;
        mid.y = ny;
        mid.f = fr.f;
        mid.d = fr.d;
        q.push_front(mid);
      }
    }
    if (a[fr.x][fr.y] == '#') {
      for (int i = 0; i < 4; i++) {
        if (i != fr.f) {
          mid.x = fr.x;
          mid.y = fr.y;
          mid.f = i;
          if (used[fr.x][fr.y][i] > fr.d) {
            used[fr.x][fr.y][i] = fr.d + 1;
            mid.d = fr.d + 1;
            q.push_back(mid);
          }
        }
      }
    }
  }
  cout << -1;
  return 0;
}
