#include <bits/stdc++.h>
using namespace std;
const int N=505;
const int inf=1e9+7;
char base[N][N];
int dist[5][N][N];
int main()
{
	int n,m;
	scanf("%i %i",&n,&m);
	for(int i=1;i<=n;i++) scanf("%s",base[i]+1);
	priority_queue<pair<int,int>> pq;
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<5;k++) dist[k][i][j]=inf;
    dist[0][1][1]=0;
    pq.push({0,N+1});
    auto Push=[&](int p, int x, int y, int d)
	{
        if(x>=1 && x<=n && y>=1 && y<=m && base[x][y]=='.' && dist[p][x][y]>d)
		{
			//printf("Push %i %i %i %i\n",p,x,y,d);
			dist[p][x][y]=d;
			pq.push({-dist[p][x][y],p*N*N+x*N+y});
		}
	};
    while(pq.size())
	{
		int p=(pq.top().second/N)/N;
		int x=(pq.top().second/N)%N;
		int y=pq.top().second%N;
		int d=-pq.top().first;
		pq.pop();
		if(dist[p][x][y]!=d) continue;
		//printf("%i %i %i %i\n",p,x,y,d);
		for(int k=0;k<5;k++)
		{
			if(dist[k][x][y]>dist[p][x][y]+k+1)
			{
				dist[k][x][y]=dist[p][x][y]+k+1;
				pq.push({-dist[k][x][y],k*N*N+x*N+y});
			}
		}
		if(p==0)
		{
			for(int dx=-1;dx<=1;dx++)
				for(int dy=-1;dy<=1;dy++)
				{
					int nx=x+dx,ny=y+dy;
					Push(p,nx,ny,dist[p][x][y]+1);
				}
		}
		else if(p==1)
		{
			for(int nx=x,ny=y;base[nx][ny]=='.';nx++,ny++) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';nx++,ny--) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';nx--,ny++) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';nx--,ny--) Push(p,nx,ny,dist[p][x][y]+1);
		}
		else if(p==2)
		{
			for(int nx=x,ny=y;base[nx][ny]=='.';nx++) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';nx--) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';ny++) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';ny--) Push(p,nx,ny,dist[p][x][y]+1);
		}
		else if(p==3)
		{
			int dst=dist[p][x][y]+1;
			Push(p,x-2,y-1,dst);
			Push(p,x-2,y+1,dst);
			Push(p,x+2,y-1,dst);
			Push(p,x+2,y+1,dst);
			Push(p,x-1,y-2,dst);
			Push(p,x+1,y-2,dst);
			Push(p,x-1,y+2,dst);
			Push(p,x+1,y+2,dst);
		}
		else if(p==4)
		{
			for(int nx=x,ny=y;base[nx][ny]=='.';nx++,ny++) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';nx++,ny--) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';nx--,ny++) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';nx--,ny--) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';nx++) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';nx--) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';ny++) Push(p,nx,ny,dist[p][x][y]+1);
			for(int nx=x,ny=y;base[nx][ny]=='.';ny--) Push(p,nx,ny,dist[p][x][y]+1);
		}
	}
	int ans=inf;
	for(int k=0;k<5;k++) ans=min(ans,dist[k][n][m]);
	printf("%i\n",ans);
    return 0;
}