#include <bits/stdc++.h>

using namespace std;

int h,w;
int a[505][505];
bool mark[505][505];
int krr [] = {0,1,1,1,0,-1,-1,-1};
int krk [] = {1,1,0,-1,-1,-1,0,1};
int kor [] = {1,-1,2,2,1,-1,-2,-2};
int kok [] = {2,2,1,-1,-2,-2,-1,1};

int kralj[505][505];
int lovac[505][505];
int top[505][505];
int konj[505][505];
int kraljica[505][505];

void zameniKralj(int r,int k)
{
    lovac[r][k] = min(lovac[r][k],kralj[r][k] + 2);
    top[r][k] = min(top[r][k],kralj[r][k] + 3);
    konj[r][k] = min(konj[r][k],kralj[r][k] + 4);
    kraljica[r][k] = min(kraljica[r][k],kralj[r][k] + 5);
}

void zameniLovac(int r,int k)
{
    kralj[r][k] = min(kralj[r][k],lovac[r][k]+1);
    top[r][k] =  min(top[r][k],lovac[r][k] + 3);
    konj[r][k] =  min(konj[r][k],lovac[r][k] + 4);
    kraljica[r][k] = min(kraljica[r][k],lovac[r][k] + 5);
}

void zameniKraljica(int r,int k)
{
     kralj[r][k] = min(kralj[r][k],kraljica[r][k]+1);
    lovac[r][k] = min(lovac[r][k],kraljica[r][k]+2);
    top[r][k] =  min(top[r][k],kraljica[r][k] + 3);
    konj[r][k] = min(konj[r][k],kraljica[r][k] + 4);
}

void zameniTop(int r,int k)
{
    kralj[r][k] = min(kralj[r][k],top[r][k]+1);
    lovac[r][k] = min(lovac[r][k],top[r][k] + 2);
    konj[r][k] = min(top[r][k] + 4,konj[r][k]);
    kraljica[r][k] = min(kraljica[r][k],top[r][k] + 5);
}

void zameniKonj(int r,int k)
{
    kralj[r][k] = min(kralj[r][k],konj[r][k]+1);
    lovac[r][k] =  min(lovac[r][k],konj[r][k] + 2);
    top[r][k] =  min(top[r][k],konj[r][k] + 3);
    kraljica[r][k] =  min(kraljica[r][k],konj[r][k] + 5);
}

bool umatrici(int r,int k)
{
    return r>=1 && r<=h && k>=1 && k<=w; 
}

int najbolje(int r,int k)
{
    int m = top[r][k];
    m = min(m,kraljica[r][k]);
    m = min(m,kralj[r][k]);
    m = min(m,lovac[r][k]);
    m = min(m,konj[r][k]);
    
    return m;
}

int main() 
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cerr.tie(0);
    
    cin >> h >> w;
    
    for(int i=1;i<=h;i++)
        for(int j=1;j<=w;j++)
            {
                char c;
                cin >> c;
                if(c=='.') a[i][j] = 1;
                else a[i][j] = 0;
                kralj[i][j] = lovac[i][j] = top[i][j] = konj[i][j] = kraljica[i][j] = 1e9; 
            }
    
    kralj[1][1] = 0;
    lovac[1][1] = 2;
    top[1][1] = 3;
    konj[1][1] = 4;
    kraljica[1][1] = 5;
    
    priority_queue<pair<int,pair<int,int>>> pq;
    pq.push({0,{1,1}});
    
    while(!pq.empty())
    {
        pair<int,int> polje = pq.top().second;
        int red = polje.first;
        int kol = polje.second;
        pq.pop();
        if(mark[red][kol]) continue;
        mark[red][kol] = true;
        
        int nr;
        int nk;
        int prev;
        
        //kralj
        for(int i=0;i<8;i++)
        {
            nr = red + krr[i];
            nk = kol + krk[i];
            if(umatrici(nr,nk) && a[nr][nk] == 1 && kralj[red][kol] + 1 < kralj[nr][nk])
            {
                prev = najbolje(nr,nk);
                kralj[nr][nk] = kralj[red][kol]+1;
                zameniKralj(nr,nk);
                if(najbolje(nr,nk) < prev) pq.push({-najbolje(nr,nk),{nr,nk}});
            }
        }
        
        //lovac
        for(int i=red+1,j=kol+1;i<=h && j<=w;i++,j++)
        {
            if(a[i][j]==0) break;
            if(lovac[red][kol] + 1 < lovac[i][j])
            {
                prev = najbolje(i,j);
                lovac[i][j] = lovac[red][kol] + 1;
                zameniLovac(i,j);
                if(najbolje(i,j) < prev) pq.push({-najbolje(i,j),{i,j}});
            }
        }
        
        for(int i=red+1,j=kol-1;i<=h && j>=1;i++,j--)
        {
            if(a[i][j]==0) break;
            if(lovac[red][kol] + 1 < lovac[i][j])
            {
                 prev = najbolje(i,j);
                lovac[i][j] = lovac[red][kol] + 1;
                zameniLovac(i,j);
                if(najbolje(i,j) < prev) pq.push({-najbolje(i,j),{i,j}});
            }
        }
        
        for(int i=red-1,j=kol-1;i>=1 && j>=1;i--,j--)
        {
            if(a[i][j]==0) break;
            if(lovac[red][kol] + 1 < lovac[i][j])
            {
                 prev = najbolje(i,j);
                lovac[i][j] = lovac[red][kol] + 1;
                zameniLovac(i,j);
                if(najbolje(i,j) < prev) pq.push({-najbolje(i,j),{i,j}});
            }
        }
        
        for(int i=red-1,j=kol+1;i>=1 && j<=w;i--,j++)
        {
            if(a[i][j]==0) break;
            if(lovac[red][kol] + 1 < lovac[i][j])
            {
                 prev = najbolje(i,j);
                lovac[i][j] = lovac[red][kol] + 1;
                zameniLovac(i,j);
                if(najbolje(i,j) < prev) pq.push({-najbolje(i,j),{i,j}});
            }
        }
        
        //top
        for(int j=kol+1;j<=w;j++)
        {
            if(a[red][j]==0) break;
            if(top[red][kol] + 1 < top[red][j])
            {
                prev = najbolje(red,j);
                top[red][j] = top[red][kol] + 1;
                zameniTop(red,j);
                if(najbolje(red,j) < prev) pq.push({-najbolje(red,j),{red,j}});
            }
        }
        
        for(int j=kol-1;j>=1;j--)
        {
            if(a[red][j]==0) break;
            if(top[red][kol] + 1 < top[red][j])
            {
                prev = najbolje(red,j);
                top[red][j] = top[red][kol] + 1;
                zameniTop(red,j);
                 if(najbolje(red,j) < prev) pq.push({-najbolje(red,j),{red,j}});
            }
        }
        
        for(int i=red+1;i<=h;i++)
        {
            if(a[i][kol]==0) break;
            if(top[red][kol] + 1 < top[i][kol])
            {
                prev = najbolje(i,kol);
                top[i][kol] = top[red][kol] + 1;
                zameniTop(i,kol);
                if(najbolje(i,kol) < prev) pq.push({-najbolje(i,kol),{i,kol}});
            }
        }
        
        for(int i=red-1;i>=1;i--)
        {
             if(a[i][kol]==0) break;
            if(top[red][kol] + 1 < top[i][kol])
            {
                prev = najbolje(i,kol);
                top[i][kol] = top[red][kol] + 1;
                zameniTop(i,kol);
                if(najbolje(i,kol) < prev) pq.push({-najbolje(i,kol),{i,kol}});
            }
        }
        
        //konj
        for(int i=0;i<8;i++)
        {
            nr = red + kor[i];
            nk = kol + kok[i];
            if(umatrici(nr,nk) && a[nr][nk]==1 && konj[red][kol] + 1 < konj[nr][nk])
            {
                prev = najbolje(nr,nk);
                konj[nr][nk] = konj[red][kol] + 1;
                zameniKonj(nr,nk);
                if(najbolje(nr,nk) < prev) pq.push({-najbolje(nr,nk),{nr,nk}});
            }
        }
        
        
        //kraljica
        for(int i=red+1,j=kol+1;i<=h && j<=w;i++,j++)
        {
            if(a[i][j]==0) break;
            if(kraljica[red][kol] + 1 < kraljica[i][j])
            {
                 prev = najbolje(i,j);
                kraljica[i][j] = kraljica[red][kol] + 1;
                zameniKraljica(i,j);
                 if(najbolje(i,j) < prev) pq.push({-najbolje(i,j),{i,j}});
            }
        }
        
        for(int i=red+1,j=kol-1;i<=h && j>=1;i++,j--)
        {
            if(a[i][j]==0) break;
            if(kraljica[red][kol] + 1 < kraljica[i][j])
            {
                 prev = najbolje(i,j);
                kraljica[i][j] = kraljica[red][kol] + 1;
                zameniKraljica(i,j);
                 if(najbolje(i,j) < prev) pq.push({-najbolje(i,j),{i,j}});
            }
        }
        
        for(int i=red-1,j=kol-1;i>=1 && j>=1;i--,j--)
        {
            if(a[i][j]==0) break;
            if(kraljica[red][kol] + 1 < kraljica[i][j])
            {
                 prev = najbolje(i,j);
                kraljica[i][j] = kraljica[red][kol] + 1;
                zameniKraljica(i,j);
                 if(najbolje(i,j) < prev)pq.push({-najbolje(i,j),{i,j}});
            }
        }
        
        for(int i=red-1,j=kol+1;i>=1 && j<=w;i--,j++)
        {
            if(a[i][j]==0) break;
            if(kraljica[red][kol] + 1 < kraljica[i][j])
            {
                 prev = najbolje(i,j);
                kraljica[i][j] = kraljica[red][kol] + 1;
                zameniKraljica(i,j);
                 if(najbolje(i,j) < prev) pq.push({-najbolje(i,j),{i,j}});
            }
        }
        
        for(int j=kol+1;j<=w;j++)
        {
            if(a[red][j]==0) break;
            if(kraljica[red][kol] + 1 < kraljica[red][j])
            {
                prev = najbolje(red,j);
                kraljica[red][j] = kraljica[red][kol] + 1;
                zameniKraljica(red,j);
                if(najbolje(red,j) < prev) pq.push({-najbolje(red,j),{red,j}});
            }
        }
        
        for(int j=kol-1;j>=1;j--)
        {
            if(a[red][j]==0) break;
            if(kraljica[red][kol] + 1 < kraljica[red][j])
            {
                prev = najbolje(red,j);
                kraljica[red][j] = kraljica[red][kol] + 1;
                zameniKraljica(red,j);
                if(najbolje(red,j) < prev) pq.push({-najbolje(red,j),{red,j}});
            }
        }
        
        for(int i=red+1;i<=h;i++)
        {
            if(a[i][kol]==0) break;
            if(kraljica[red][kol] + 1 < kraljica[i][kol])
            {
                prev = najbolje(i,kol);
                kraljica[i][kol] = kraljica[red][kol] + 1;
                zameniKraljica(i,kol);
                if(najbolje(i,kol) < prev)pq.push({-najbolje(i,kol),{i,kol}});
            }
        }
        
        for(int i=red-1;i>=1;i--)
        {
             if(a[i][kol]==0) break;
             if(kraljica[red][kol] + 1 < kraljica[i][kol])
            {
                prev = najbolje(i,kol);
                kraljica[i][kol] = kraljica[red][kol] + 1;
                zameniKraljica(i,kol);
                if(najbolje(i,kol) < prev) pq.push({-najbolje(i,kol),{i,kol}});
            }
        }
    }
    
    if(mark[h][w])  cout << najbolje(h,w);
    else cout << -1;
    
    return 0;
}