#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int h, w; cin >> h >> w; vector g(h); for (int i = 0; i < h; i++) cin >> g[i]; const long long INF = (long long)4e18; vector upA(w, INF), upB(max(0, w - 1), INF), upC(w, INF), upD(max(0, w - 1), INF); for (int r = 0; r < h; r++) { vector a(w, INF), b(max(0, w - 1), 0), c(w, 0), d(max(0, w - 1), 0); long long leftA = INF, leftB = INF, leftC = INF, leftD = INF; bool down = (r + 1 < h); bool top = (r > 0); bool first = (r == 0); for (int j = 0; j < w; j++) { long long cur = (first && j == 0 ? 0 : INF); if (g[r][j] != '#') { if (upA[j] < cur) cur = upA[j]; if (upC[j] < cur) cur = upC[j]; if (leftA < cur) cur = leftA; if (leftB < cur) cur = leftB; } a[j] = cur; long long x = 0, y = 0; if (j + 1 < w) { x = cur + 1; if (top) { if (upB[j] < x) x = upB[j]; if (upD[j] < x) x = upD[j]; } b[j] = x; } if (down) { y = cur + 1; if (j) { if (leftC < y) y = leftC; if (leftD < y) y = leftD; } c[j] = y; } if (down && j + 1 < w) { long long z = x; if (y < z) z = y; d[j] = z + 1; } leftA = cur; if (j + 1 < w) leftB = b[j]; if (down) { leftC = c[j]; if (j + 1 < w) leftD = d[j]; } } upA.swap(a); upB.swap(b); upC.swap(c); upD.swap(d); } long long res = upA[w - 1]; if (res >= INF / 2) cout << -1 << '\n'; else cout << res + h + w - 2 << '\n'; return 0; }