#include<bits/stdc++.h>
using namespace std;
struct zs{
int x,y,s,xl=6;
}zd,qd,xd;
char mp[10][10];
int n,m,b[10][10],fx[4][2]={-1,0,0,1,1,0,0,-1};
queue<zs> q;
void bfs(){
while(!q.empty()){
qd=q.front();
q.pop();
for(int i=0;i<4;i++){
xd.x=qd.x+fx[i][0];
xd.y=qd.y+fx[i][1];
xd.s=qd.s+1;
xd.xl=qd.xl-1;
if((mp[xd.x][xd.y]=='1'||mp[xd.x][xd.y]=='3'||mp[xd.x][xd.y]=='4')&&xd.xl>0&&b[xd.x][xd.y]==0&&xd.x>0&&xd.x<=n&&xd.y>0&&xd.y<=m){
if(mp[xd.x][xd.y]=='4'&&xd.xl!=0){
xd.xl=6;
}
b[xd.x][xd.y]=1;
if(xd.x==zd.x&&xd.y==zd.y){
cout<<xd.s;
return;
}
q.push(xd);
}
}
}
cout<<"-1";
}
int main()
{
int i,j;
cin>>n>>m;
for(i=1;i<=n;i++) for(j=1;j<=m;j++){
cin>>mp[i][j];
if(mp[i][j]=='2') qd.x=i,qd.y=j;
if(mp[i][j]=='3') zd.x=i,zd.y=j;
}
q.push(qd);
bfs();
return 0;
}