#include <bits/stdc++.h>
using namespace std;
int maps[9][9],v[9][9];
int sx,sy,step,ans=100;
int n,m; //地图大小 n行m列
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1}; //向上,右,下,左
/*
数字0 障碍物
数字1 空地
数字2 出发点
数字3 终点
数字4 加血包
*/
bool in(int x,int y)
{
return x>=1&&x<=m&&y>=1&&y<=n;
}
void dfs(int x,int y,int xie)
{
if(xie==0){
return;
}
if(maps[x][y]==3){
ans=min(step,ans);
return;
}
if(maps[x][y]==4){
xie=6;
}
for(int i=0; i<4; i++){
int ddx=x+dx[i];
int ddy=y+dy[i];
if(!v[ddx][ddy]&&maps[ddx][ddy]!=0&&in(ddx,ddy)){
step++;
v[ddx][ddy]=1;
dfs(ddx,ddy,xie-1);
step--;
v[ddx][ddy]=0;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
scanf("%d",&maps[i][j]);
if(maps[i][j]==2){
sx=i,sy=j;
}
}
}
dfs(sx,sy,6);
if(ans==0) printf("-1");
else printf("%d",ans);
return 0;
}