#include<bits/stdc++.h>
using namespace std;
int n,m,a[1010][1010],vis[1010][1010],x,y,ans=1e8;
int d1[5]={0,1,-1,0,0},d2[5]={0,0,0,1,-1},k=0;
struct pos{
int x,y,cost;
}l[100010];
queue<pos>s;
bool check1(int x,int y){
return x>=1 && x<=n && y>=1 && y<=m && !vis[x][y] && a[x][y]!=1 && a[x][y]!=3;
}
void bfs1(int x,int y){
vis[x][y]=1;
int ax,ay,ac,bx,by;
s.push((pos){x,y,0});
while(!s.empty()){
ax=s.front().x,ay=s.front().y,ac=s.front().cost;s.pop();
if(a[ax][ay]==4){
for(int i=1;i<=k;i++){
if(l[i].x==ax && l[i].y==ay) l[i].cost=ac;
}
continue;
}
for(int i=1;i<=4;i++){
bx=ax+d1[i],by=ay+d2[i];
if(check1(bx,by)){
vis[bx][by]=1;
s.push((pos){bx,by,ac+1});
}
}
}
return;
}
bool check2(int x,int y){
return x>=1 && x<=n && y>=1 && y<=m && !vis[x][y] && a[x][y]!=1;
}
void bfs2(int x,int y,int c){
vis[x][y]=1;
int ax,ay,ac,bx,by;
s.push((pos){x,y,c});
while(!s.empty()){
ax=s.front().x,ay=s.front().y,ac=s.front().cost;s.pop();
if(a[ax][ay]==3){
ans=min(ans,ac);
return;
}
for(int i=1;i<=4;i++){
bx=ax+d1[i],by=ay+d2[i];
if(check2(bx,by)){
vis[bx][by]=1;
s.push((pos){bx,by,ac+1});
}
}
}
return;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>m>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]==2) x=i,y=j;
if(a[i][j]==4) l[++k]=(pos){i,j,0};
}
}
bfs1(x,y);
for(int i=1;i<=k;i++){
if(l[i].cost==0) continue;
memset(vis,0,sizeof(vis));
while(!s.empty()) s.pop();
bfs2(l[i].x,l[i].y,l[i].cost);
}
cout<<ans;
return 0;
}