#include<iostream>
using namespace std;
int n,m,minn=0x3f3f3f3f,oran=0,purx=0,pury=0;
int map[2050][2050];
bool vis[2050][2050];
int xx[]={0,1,0,-1,0};
int yy[]={0,0,1,0,-1};
void dfs(int x,int y,int sum)
{
if(x==n&&y==m)
{
minn=min(sum,minn);
return;
}
if(map[x][y]==4)
{
int cx=x+purx,cy=y+pury;
if(cx>n||cy>m)return;
if(cx<=0||cy<=0)return;
if(vis[cx][cy])return;
if(map[cx][cy]==3||!map[cx][cy])
{
for(int i=1;i<=4;i++)
{
int cxx=x+xx[i],cyy=y+yy[i];
if(cxx>n||cyy>m||cx<=0||cy<=0)continue;
if(vis[cx][cy])continue;
if(map[cxx][cyy]==3||!map[cxx][cyy])continue;
if(map[cxx][cyy]==2)oran=1;
if(map[cxx][cyy]==4)
{
oran=0;
purx=xx[i],pury=yy[i];
dfs(cxx,cyy,sum+1);
return;
}
vis[cxx][cyy]=1;
dfs(cxx,cyy,sum+1);
vis[cxx][cyy]=0;
}
return;
}
if(map[cx][cy]==2)oran=1;
if(map[cx][cy]==4)
{
oran=0;
dfs(cx,cy,sum+1);
return;
}
vis[cx][cy]=1;
dfs(cx,cy,sum+1);
vis[cx][cy]=0;
return;
}
for(int i=1;i<=4;i++)
{
int cx=x+xx[i],cy=y+yy[i];
if(cx>n||cy>m)continue;
if(cx<=0||cy<=0)continue;
if(vis[cx][cy])continue;
if(!map[cx][cy])continue;
if(map[cx][cy]==3&&!oran)continue;
if(map[cx][cy]==2)oran=1;
if(map[cx][cy]==4)
{
oran=0;
purx=xx[i],pury=yy[i];
dfs(cx,cy,sum+1);
return;
}
vis[cx][cy]=1;
dfs(cx,cy,sum+1);
vis[cx][cy]=0;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
}
}
dfs(1,1,0);
if(minn==0x3f3f3f3f)cout<<"-1";
else cout<<minn;
}