#include<bits/stdc++.h>
using namespace std;
int n,m,sum,d[5][2]={{1,0},{0,1},{-1,0},{0,-1}},a[1005][1005],sx,sy,ex,ey,f=1;
bool vis[1005][1005];
struct node{
int x,y,id,step;
};
queue<node> Q;
void bfs(){
while(!Q.empty()){
node q=Q.front();
Q.pop();
for(int i=0;i<4;i++){
int nx=q.x+d[i][0],ny=q.y+d[i][1],nid=q.id,nstep=q.step;
if(nx==ex&&ny==ey&&q.id>0) return;
if(q.id==0){
f=0;
return;
}
if(nx>n||ny>n||nx<1||ny<1||a[nx][ny]==0||vis[nx][ny]==1) continue;
vis[nx][ny]=1;
if(a[nx][ny]==4) Q.push({nx,ny,nid,nstep+1});
Q.push({nx,ny,nid-1,nstep+1});
sum++;
}
}
}
signed main(){
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]==2){
sx=i;
sy=j;
}
if(a[i][j]==3){
ex=i;
ey=j;
}
}
}
Q.push({sx,sy,6,1});
vis[sx][sy]=1;
bfs();
if(f) cout<<sum;
else cout<<-1;
return 0;
}