#include <iostream>
#include <stdio.h>
#include <bits/stdc++.h>
#include <strings.h>

using namespace std;
bool db[500][500];
bool visited[500][500];
int w,h;

int mY[] = {-1, 0, 0, 1, 1, 1, -1, -1};
int mX[] = {0, -1, 1, 0, -1, 1, 1, -1};
struct Point
{
    int x;
    int y;
};

struct qNode{
    Point pt;
    int dist;
};

bool isValid(int x, int y) {
    return (x >= 0) && (x < w) &&
           (y >= 0) && (y < h);
}

int bfs(Point src, Point des){
    if (!db[src.x][src.y] || !db[des.x][des.y])
    return -1;

    queue<qNode> q;

    qNode s={src, 0};
    q.push(s);

    while(!q.empty()){
        qNode cr=q.front();
        Point pt=cr.pt;

        if(pt.x==w-1&&pt.y==h-1)return cr.dist;
        q.pop();

        for(int i=0; i<8;i++){
            int rw=pt.x+mX[i];
            int cl=pt.y+mY[i];
            if(isValid(rw, cl)&&db[rw][cl]&&!visited[rw][cl]){
                visited[rw][cl]=true;
                qNode Adj{{rw, cl}, cr.dist+1};
                q.push(Adj);
            }

        }



    }







}
int main()
{
    char c;
    cin>>w>>h;
    for(int i=0; i<w;i++){
        for(int k=0; k<h;k++){
            cin>>c;
            if(c=='.'){
                db[i][k]=true;
            }else{
                db[i][k]=false;
            }
        }
    }

    cout<<bfs({0,0}, {w-1, h-1});




}