#include<bits/stdc++.h>
using namespace std;
int m,n;
struct node{
int x;
int y;
};
int a[15][15];
int vis[15][15];
int ans[15][15];
int ex[15][15];
const int dx[5]={0,1,-1,0,0};
const int dy[5]={0,0,0,1,-1};
queue <node>q;
int sx,sy;
int hx,hy;
int x,y,tx,ty;
int bfs(){
q.push((node){sx,sy});
vis[sx][sy]=1;
while(!q.empty()){
x=q.front().x;
y=q.front().y;
q.pop();
if(x==hx&&y==hy){
return ans[x][y];
}
if(ex[x][y]==1) return -1;
for(int i=1;i<=4;i++){
tx=x+dx[i];
ty=y+dy[i];
if(tx<=0||tx>n||ty<=0||ty>m) continue;
if(a[tx][ty]==0||vis[tx][ty]==1) continue;
ex[tx][ty]=ex[x][y]-1;
if(a[tx][ty]==4) ex[tx][ty]=6;
ans[tx][ty]=ans[x][y]+1;
vis[tx][ty]=1;
q.push((node){tx,ty});
}
}
return -1;
}
int main() {
scanf("%d",&n);
scanf("%d",&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int x;
scanf("%d",&x);
a[i][j]=x;
if(x==2){
sx=i,sy=j;
}else if(x==3){
hx=i,hy=j;
}
}
}
ex[sx][sy]=6;
printf("%d",bfs());
}