#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<string>
#include<sstream>
#include<cmath>
using namespace std;
#define REP(i, j) for(int i = 0; i < j; i++)
#define FOR(i, j, k) for(int i = j; i < k; i++)
const int H = 7;
const int W = 7;
const int P = H * W + 10;
const int INF = P * P;

class C{
  public:
    int y, x, cy, cx, s, p;
    C(int _y, int _x, int _cy, int _cx, int _s, int _p){
      y = _y;
      x = _x;
      cy = _cy;
      cx = _cx;
      s = _s;
      p = _p;
    }
    bool operator >(const C c) const{
      return p > c.p;
    }
};

int w, h;

int main(){
  while(cin >>w >>h && w){
    vector< vector<int> > v(h, vector<int>(w));
    int sy, sx, scy, scx;
    REP(i, h){
      REP(j, w){
        cin >>v[i][j];
        if(v[i][j] == 4){
          sy = i;
          sx = j;
          v[i][j] = 0;
        }
        if(v[i][j] == 2){
          scy = i;
          scx = j;
          v[i][j] = 0;
        }
      }
    }

    int ans = -1;
    priority_queue<C, vector<C>, greater<C> > open;
    open.push( C(sy, sx, scy, scx, 0, 0) );
    int closed[P][H][W][H][W];
    REP(i, P) REP(j, H) REP(k, W) REP(l, H) REP(m, W) closed[i][j][k][l][m] = INF;


    while(!open.empty()){
      C now = open.top();
      open.pop();

      //debug
      //cout <<now.y <<" " <<now.x <<" " <<now.cy <<" " <<now.cx <<" " <<now.s <<" " <<now.p <<endl;

      if(v[now.cy][now.cx] == 3){
        ans = now.p;
        break;
      }

      //debug
      //cout <<"step 1" <<endl;
      //cout <<now.s <<" " <<closed[now.p][now.y][now.x][now.cy][now.cx] <<endl;

      if(now.s >= closed[now.p][now.y][now.x][now.cy][now.cx]) continue;
      closed[now.p][now.y][now.x][now.cy][now.cx] = now.s;

      //debug
      //cout <<"step 2" <<endl;

      int my[] = {1, -1, 0, 0};
      int mx[] = {0, 0, 1, -1};
      REP(i, 4){
        int ny = now.y + my[i];
        int nx = now.x + mx[i];
        if(ny < 0 || nx < 0 || ny >= h || nx >= w || v[ny][nx] == 1) continue;
        if(ny == now.cy && nx == now.cx){
          int ncy = ny + my[i];
          int ncx = nx + mx[i];
          if(ncy < 0 || ncx < 0 || ncy >= h || ncx >= w || v[ncy][ncx] == 1) continue;
          open.push( C(ny, nx, ncy, ncx, now.s + 1, now.p + 1) );
        } else{
          open.push( C(ny, nx, now.cy, now.cx, now.s + 1, now.p) );
        }
      }
    }

    cout <<ans <<endl;
  }
  return 0;
}