#include <iostream>
#include <queue>

int mat[500][500] = {0};
int h, w;

using namespace std;

void mapiraj(int xp, int yp, int x, int y)
{
	if(mat[y][x]>mat[yp][xp]+1||mat[y][x]==-1){
	mat[y][x]=mat[yp][xp]+1;
	if(x<w)
		mapiraj(x, y, x+1, y);
	if(x>0)
		mapiraj(x, y, x-1, y);
	if(y<h)
		mapiraj(x, y, x, y+1);
	if(y>0)
		mapiraj(x, y, x, y-1);
	if(y<h&&x<w)
		mapiraj(x, y, x+1, y+1);
	if(x>0&&y>0)
		mapiraj(x, y, x-1, y-1);
	if(x>0&&y<h)
		mapiraj(x, y, x-1, y+1);
	if(x<w&&y>0)
		mapiraj(x, y, x+1, y-1);}
	
}

int main()
{
	scanf("%d%d", &h, &w);
	for(int i = 0;i<h;i++)
	{
		for(int j = 0;j<w;j++)
		{
			char c;
			scanf(" %c", &c);
			if(c=='#')
				mat[i][j] = -2;
			else if(c=='.')
				mat[i][j] = -1;
		}
	}
	/*mat[0][0] = 0;
	mapiraj(0, 0, 1, 0);
	mapiraj(0, 0, 1, 1);
	mapiraj(0, 0, 0, 1);
	printf("%d", mat[h-1][w-1]);*/
	bool dobar = false;
	queue<pair<int, int>> red;
	pair<int, int> tr = make_pair(0, 0);
	int slst = 0;
	pair<int, int> sllo = tr;
	red.push(tr);
	while(!red.empty())
	{
		bool stavi = false;
		tr = red.front();
		red.pop();
		if(tr==sllo)
		{
			slst++;
			stavi = true;
		}
		if(tr.first==w-1&&tr.second==h-1)
		{
			dobar = true;
			break;
		}
		mat[tr.second][tr.first] = slst;
		pair<int, int> gore, levo, desno, dole, gorelevo, goredesno, dolelevo, doledesno;
		gore.first = dole.first = tr.first;
		levo.second = desno.second = tr.second;
		gore.second = goredesno.second = gorelevo.second = (tr.second!=0)?(tr.second-1):0;
		dole.second = doledesno.second = dolelevo.second = (tr.second!=h-1)?(tr.second+1):h-1;
		levo.first = gorelevo.first = dolelevo.first = (tr.first!=0)?(tr.first-1):0;
		desno.first = goredesno.first = doledesno.first = (tr.first!=w-1)?(tr.first+1):w-1;
		if(mat[gore.second][gore.first]==-1)
		{
			red.push(gore);
			mat[gore.second][gore.first] = slst;
			if(stavi)
			{
				sllo = gore;
				stavi = false;
			}
		}
		if(mat[dole.second][dole.first]==-1)
		{
			red.push(dole);
			mat[dole.second][dole.first] = slst;
			if(stavi)
			{
				sllo = dole;
				stavi = false;
			}
		}
		if(mat[levo.second][levo.first]==-1)
		{
			red.push(levo);
			mat[levo.second][levo.first] = slst;
			if(stavi)
			{
				sllo = levo;
				stavi = false;
			}
		}
		if(mat[desno.second][desno.first]==-1)
		{
			red.push(desno);
			mat[desno.second][desno.first] = slst;
			if(stavi)
			{
				sllo = desno;
				stavi = false;
			}
		}
		if(mat[gorelevo.second][gorelevo.first]==-1)
		{
			red.push(gorelevo);
			mat[gorelevo.second][gorelevo.first] = slst;
			if(stavi)
			{
				sllo = gorelevo;
				stavi = false;
			}
		}
		if(mat[goredesno.second][goredesno.first]==-1)
		{
			red.push(goredesno);
			mat[goredesno.second][goredesno.first] = slst;
			if(stavi)
			{
				sllo = goredesno;
				stavi = false;
			}
		}
		if(mat[dolelevo.second][dolelevo.first]==-1)
		{
			red.push(dolelevo);
			mat[dolelevo.second][dolelevo.first] = slst;
			if(stavi)
			{
				sllo = dolelevo;
				stavi = false;
			}
		}
		if(mat[doledesno.second][doledesno.first]==-1)
		{
			red.push(doledesno);
			mat[doledesno.second][doledesno.first] = slst;
			if(stavi)
			{
				sllo = doledesno;
				stavi = false;
			}
		}
	}
	printf("%d", mat[h-1][w-1]);
	return 0;
}