#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy,t=0,minn=1<<30,HP=6;
int a[100][100],vis[100][100];
int next[4][2]={{-1,0},{0,1},{0,-1},{1,0}};
bool f=false;
void dfs(int x,int y){
if(HP==0)return; //死亡则返回上一步
if(a[x][y]==3){ //如果回到家
f=true;
if(t<minn)minn=t; //记录最短时间
return;
}
if(a[x][y]==4){ //捡血包
HP=6;
}
for(int i=0;i<4;i++){
int dx=x+next[i][0],dy=y+next[i][1];
if(a[dx][dy]&&dx>=1&&dx<=n&&dy>=1&&dy<=m&&!vis[dx][dy]){
HP--;
vis[dx][dy]=1;
dfs(dx,dy);
HP++;
vis[dx][dy]=0;
}
}
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='2'){ //记录起点
vis[i][j]=1;
sx=i,sy=j;
}
}
dfs(sx,sy); //从起点开始遍历
if(f)cout<<minn;
else cout<<-1;
return 0;
}