#include<bits/stdc++.h>
using namespace std;
int n,m,ans,dist[1010][1010][4],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
char mapp[1010][1010];
struct node
{
int x,y,d;
};
deque<node>q;
void ftadd(int x,int y,int d,int step)
{
if(step<dist[x][y][d])
{
q.push_front((node){x,y,d});
dist[x][y][d]=step;
}
}
void bkadd(int x,int y,int d,int step)
{
if(step<dist[x][y][d])
{
q.push_back((node){x,y,d});
dist[x][y][d]=step;
}
}
void bfs()
{
ftadd(n,m,1,0);
while(q.size())
{
node k=q[0];
q.pop_front();
int d=k.d,xx=k.x+dx[d],yy=k.y+dy[d],dis=dist[k.x][k.y][d];
if(xx>=1&&xx<=n&&yy>=1&&yy<=n)ftadd(xx,yy,d,dis);
if(mapp[k.x][k.y]=='#')
{
for(int l=0;l<4;l++)
{
if(l!=d)bkadd(k.x,k.y,l,dis+1);
}
}
}
}
signed main()
{
memset(dist,0x3f3f3f3f,sizeof(dist));
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mapp[i][j];
}
}
bfs();
if(dist[1][1][1]==0x3f3f3f3f)cout<<-1;
else cout<<dist[1][1][1];
return 0;
}