#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,HP;
};
int m,n=0;
queue<node>q;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int vis[102][102]={};
int mp[102][102]={};
int road[102][102]={};
int bfs(int x,int y,int x1,int y1){
q.push((node){x,y,6});
vis[x][y]=6;
while(!q.empty()){
node oxy=q.front();
q.pop();
for(int i=0;i<4;i++){
node nxy;
nxy.x=oxy.x+dx[i];
nxy.y=oxy.y+dy[i];
if(nxy.x<1||nxy.x>n||nxy.y<1||nxy.y>m)continue;
if(mp[nxy.x][nxy.y]==0)continue;
if((oxy.HP-1)<=vis[nxy.x][nxy.y])continue;
nxy.HP=oxy.HP-1;
if(mp[nxy.x][nxy.y]==4)nxy.HP=6;
if(nxy.HP==0)continue;
q.push(nxy);
road[nxy.x][nxy.y]=road[oxy.x][oxy.y]+1;
vis[nxy.x][nxy.y]=nxy.HP;
}
}
return road[x1][y1];
}
int main(){
cin>>n>>m;
int qx,qy,zx,zy;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
if(mp[i][j]==2){
qx=i;
qy=j;
}
if(mp[i][j]==3){
zx=i;
zy=j;
}
}
}
int res=bfs(qx,qy,zx,zy);
if(res==0){
cout<<"-1";
}else{
cout<<res;
}
return 0;
}