#include <cstdio>
#include <algorithm>
#define M 11
using namespace std;
short int g[M][M],dir_x[4]= {-1,1,0,0},dir_y[4]= {0,0,-1,1},n,m;
bool vis[M][M];
int hp=6,steps=0,minstep=99999;
bool exced(int x,int y) {
return x<1||y<1||x>n||y>m;
}
void solve(int x,int y) {
if(hp<=0){
return;
}
if(g[x][y]==4) //恢复血量
hp=6;
if(g[x][y]==3){
minstep=min(minstep,steps);
return;
}
for(int i=0; i<4; i++) {
int nx=x+dir_x[i],ny=y+dir_y[i];
if((!exced(nx,ny))&&(!vis[nx][ny])&&g[nx][ny]!=0){
hp--;
steps++;
vis[nx][ny]=true;
solve(nx,ny);
vis[nx][ny]=false;
steps--;
hp++;
}
}
}
int main() {
int i,j,x,y;
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++) {
scanf("%d",&g[i][j]);
if(g[i][j]==2) {
x=i;
y=j;
}
}
}
solve(x,y);
if(minstep!=99999){
printf("%d",minstep);
}
else
printf("-1");
return 0;
}