#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
int map[20][20],n,m,bj[20][20],begin_x,begin_y,end_x,end_y,dis[20][20],blood=6;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int ans=1000000;
void search(int x,int y)
{
for(int i=0;i<=3;i++)
{
int ox=x+dx[i];
int oy=y+dy[i];
if(ox>=1&&ox<=n&&oy>=1&&oy<=m&&bj[ox][oy]==0)
{
if(blood==1)
{
return;
}
else
{
if(map[ox][oy]==4)
{
blood=6;
bj[ox][oy]=1;
dis[ox][oy]=dis[x][y]+1;
blood--;
search(ox,oy);
bj[ox][oy]=0;
blood++;
}
else
{
bj[ox][oy]=1;
dis[ox][oy]=dis[x][y]+1;
blood--;
if(map[ox][oy]==3)
{
ans=min(ans,dis[ox][oy]);
}
else search(ox,oy);
bj[ox][oy]=0;
blood++;
}
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]==0)
{
bj[i][j]=1;
}
if(map[i][j]==2)
{
begin_x=i;
begin_y=j;
}
if(map[i][j]==3)
{
end_x=i;
end_y=j;
}
}
}
bj[begin_x][begin_y]=1;
dis[begin_x][begin_y]=0;
search(begin_x,begin_y);
if(dis[end_x][end_y]!=0)
{
cout<<ans;
return 0;
}
cout<<-1;
}