#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,m; //n行 m列
char a[45][45]; //a是地图
int vis[45][45]; //标记走了多少步
int dx[4]={1,0,-1,0}; //改变x坐标
int dy[4]={0,1,0,-1}; //改变x坐标
struct node{ //表示一个点(x,y)
int x,y;
};
void bfs(int x,int y){
memset(vis,-1,sizeof vis); //给vis数组全部初始化为-1
queue<node > que; //创建队列
que.push({x,y});
vis[x][y] = 0;
while(que.size()){
node n1 = que.front(); //拿到队头数据
que.pop(); //出队
for(int i=0;i<4;i++){
int xx=n1.x+dx[i];
int yy=n1.y+dy[i];
if(xx>=0 && xx<n && yy>=0 && yy<m && a[xx][yy]!='#' && vis[xx][yy]==-1){
que.push({xx,yy});
vis[xx][yy] = vis[n1.x][n1.y]+1;
}
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
bfs(0,0);
cout<<vis[n-1][m-1]+1; //加上起点
return 0;
}