#include <iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
 
#define ll long long
 
ll n,m,di[]{1,-1,0,0},dj[]{0,0,1,-1},di1[]{1,-1,1,-1},dj1[]{1,1,-1,-1};
vector<ll> ans[300001];
string s;
vector<bool> a[300001],was[300001];
 
bool ok(ll i,ll j){
   if(i>0 and j>0 and i<n and j<m){
      return (a[i][j] and a[i-1][j] and a[i][j-1] and a[i-1][j-1]);
   }else return false;
}

void bfs(int si,int sj){
   priority_queue<pair<int,int>> a;
   a.push(make_pair(si,sj));
   ans[si][sj]=0;
   while(!a.empty()){
      pair<int,int> cur=a.top();
      int i=cur.first,j=cur.second;
      a.pop();
      if(was[i][j])break;
      was[i][j]=1;
      for(int k=0;k<4;k++){
         int ci=i+di1[k],cj=j+dj1[k];
         if(ok(ci,cj) and ans[ci][cj]>ans[i][j]+5){
            ans[ci][cj]=ans[i][j]+5;
            was[ci][cj]=0;
            a.push(make_pair(ci,cj));
         }
      }
      for(int k=0;k<4;k++){
         int ci=i+di[k],cj=j+dj[k];
         if(ok(ci,cj) and ans[ci][cj]>ans[i][j]+4){
            ans[ci][cj]=ans[i][j]+4;
            was[ci][cj]=0;
            a.push(make_pair(ci,cj));
         }
      }
   }
}
 
int main()
{
   cin>>n>>m;
   for(ll i=0;i<n;i++){
      cin>>s;
      ans[i].resize(m);
      was[i].resize(m);
      for(ll j=0;j<m;j++){
         ans[i][j]=999999999;
         was[i][j]=0;
         a[i].push_back(s[j]!='#');
      }
   }
   ans[1][1]=0;
   bfs(1,1);
   cout<<(ans[n-1][m-1]==999999999?-1:ans[n-1][m-1]);
   return 0;
}