#include <iostream>
#include <queue>
using namespace std;
struct poz{int x,y;};
bool moze(int x,int y,int n,int m)
{
    return (x>=0 && y>=0 && x<n && y<m);
}
int main()
{
    int h,w;
    cin>>h>>w;
    char T[h][w];
    int mat[h][w];
    queue <poz> qp;
    poz temp,tempp;
    for(int i=0;i<h;i++)
        for(int j=0;j<w;j++)
        {
            cin>>T[i][j];
            /*if(T[i][j]=='#') Tpom[i][j]=-1;
            else Tpom[i][j]=0;*/
            mat[i][j]=10000;
        }
    int pravac[8][2]={{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1},{1,0},{-1,0}};
    mat[0][0]=0;
    temp.x=0; temp.y=0;
    qp.push(temp);
    while(!qp.empty())
    {
        temp=qp.front();
        qp.pop();
        for(int i=0;i<8;i++)
        {
            int X=temp.x+pravac[i][0];
            int Y=temp.y+pravac[i][1];
            if(moze(X,Y,h,w) && mat[X][Y]==10000 && T[X][Y]!='#')
            {
                mat[X][Y]=mat[temp.x][temp.y]+1;
                tempp.x=X;tempp.y=Y;
                qp.push(tempp);
            }
        }
    }
    if(mat[h-1][w-1]==10000) cout<<-1;
    else
    cout<<mat[h-1][w-1];
    return 0;
}