#include<bits/stdc++.h>
using namespace std;
int r,c;
char a[10000][10000];
char b[10000][10000];
int d[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int vis[10000][10000];
struct node{
int x;
int y;
int step;
int HP;
} q[10000010];
void bfs(int sx,int sy,int ex,int ey){
int head=1;
int tail=1;
q[tail].step=0;
q[tail].x=sx;
q[tail].y=sy;
q[tail].HP=6;
vis[sx][sy]=1;
tail++;
while(head<tail){
int x0=q[head].x;
int y0=q[head].y;
int step =q[head].step;
int HP=q[head].HP;
head++;
if(x0==ex && y0==ey){
cout<<step;
return;
}
for(int i=0;i<4;i++){
int nx=x0+d[i][0];
int ny=y0+d[i][1];
if(nx>=0 && ny>=0 && nx<r && ny<c && a[nx][ny]!='0' && vis[nx][ny]==0 && HP>0){
if(a[nx][ny]=='4'){
q[tail].x=nx;
q[tail].y=ny;
q[tail].step=step+1;
q[tail].HP=6;
vis[nx][ny]=1;
tail++;
}else{
q[tail].x=nx;
q[tail].y=ny;
q[tail].step=step+1;
vis[nx][ny]=1;
q[tail].HP=HP-1;
tail++;
}
}
}
}
cout<<-1;
}
int main(){
cin>>r>>c;
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cin>>a[i][j];
b[i][j]=a[i][j];
}
}
int ec;
int er;
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(a[i][j]=='3'){
ec=i;
er=j;
}
}
}
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(a[i][j]=='2'){
bfs(i,j,ec,er);
return 0;
}
}
}
return 0;
}