#include<iostream>
#include<queue>
using namespace std;
const int N = 10 + 10;
int a[N][N], dx[4] = { -1,1,0,0 }, dy[4] = { 0,0,-1,1 }, n, m, cur, sx, sy, res;
bool f[N][N];
queue<int> que;
void dfs(int x, int y, int hp, int dep)
{
if (hp <= 0||dep>=res) return;
if (a[x][y] == 3) {
res = min(res, dep);
return;
}
int tem = hp;
f[x][y] = 1;
if (a[x][y] == 4) {
hp = 6;
}
for (int i = 0; i <= 3; i++) {
int newx = x + dx[i];
int newy = y + dy[i];
if (0 < newx && newx <= n && 0 < newy && newy <= m && !f[x + dx[i]][y + dy[i]] && a[x + dx[i]][y + dy[i]] != 0)
dfs(x + dx[i], y + dy[i], hp - 1, dep + 1);
}
f[x][y] = 0;
if (a[x][y] == 4) hp = tem;
return;
}
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) sx = i, sy = j;
}
}
res = 1e9;
cur = 6;
dfs(sx, sy, cur, 0);
if (res == 1e9) cout << -1 << endl;
else cout << res << endl;
return 0;
}