#include<bits/stdc++.h>
using namespace std;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int ans=100000;
struct node{
int x1;int y1;
int t;int hp;
};
int a[10][10],vis[10][10],ans1[10][10];
queue<node>q;
int n,m;
int main() {
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]==3){
node xt;
xt.x1=i;xt.y1=j;xt.t=0;xt.hp=6;
ans1[i][j]=6;
q.push(xt);
vis[i][j]=5;
}
if(a[i][j]==0){
vis[i][j]=5;
}
if(a[i][j]==3){
ans1[i][j]=1;
}
}
}
while(q.size()){
node yt=q.front();
q.pop();
int xv=yt.x1,yv=yt.y1,ti=yt.t,hpo=yt.hp-1;
if(hpo==0){
continue;
}
if(ti>n*m||ti>=1000000)continue;
if(a[xv][yv]==2){
ans=min(ans,ti);
continue;
}
for(int i=0;i<4;i++){
int nx=xv+dx[i];
int ny=yv+dy[i];
if(ny>m||nx>n||nx<1||ny<1||vis[nx][ny]==5){
continue;
}
if(a[nx][ny]==4){
hpo=6;
}
if(ans1[nx][ny]>=hpo){
continue;
}
node op;
op.x1=nx;op.y1=ny;op.t=ti+1;op.hp=hpo;ans1[nx][ny]=hpo;
q.push(op);
}
}
if(ans==100000){
cout<<-1;
return 0;
}
cout<<ans;
}