#include <iostream>
#include <queue>
using namespace std;
const int Max = 12;
class graph {
public:
int x , y , hp=0 , s , step;
}g[Max][Max];
int n , m , i , j , k , visited[Max][Max] , sx , sy , dx[4]={1,-1,0,0} , dy[4]={0,0,1,-1};
void BFS(int s_x , int s_y) {
queue<int> q[2];
if(g[s_x][s_y].s==3){cout << 0;return;}
g[s_x][s_y].step=0;
g[s_x][s_y].hp = 6;
q[0].push(s_x) ; q[1].push(s_y);
while(!q[0].empty())
{
int x = q[0].front(),y=q[1].front();
q[0].pop();q[1].pop();
if(g[x][y].step>m*n){cout << -1;return;}
for(int k=0;k<4;k++)
{
int xx = x+dx[k] , yy=y+dy[k];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&visited[xx][yy]!=1&&g[x][y].hp-1>0)
{
if(g[xx][yy].s==3){cout << g[x][y].step+1;return;}
g[xx][yy].step = g[x][y].step+1;
g[xx][yy].hp = max(g[x][y].hp-1 , g[xx][yy].hp);
q[0].push(xx) ; q[1].push(yy);
if(g[xx][yy].s==4){g[xx][yy].hp=6;}
}
}
}
cout << -1;
}
int main() {
cin >> n >> m;
for(i=0;i<n;i++) {
for(j=0 ; j<m;j++)
{
cin >> g[i][j].s;
if(g[i][j].s==2){sx=i , sy=j;}
g[i][j].x = i;
g[i][j].y = j;
if(g[i][j].s==0)visited[i][j]=1;
}
}
BFS(sx,sy);
}