#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

const int dy[]={-1,0,0,1};
const int dx[]={0,-1,1,0};

int main(){

    int w,h;
    int field[20][20];
    while(cin>>w>>h&&!(w==0&&h==0)){
        int gy,gx,sy,sx;
        int mx,my;
        for(int i = 0; i < h; i++){
            for(int j = 0; j < w; j++){
                cin>>field[i][j];
                if(field[i][j]==3){
                    gy=i;
                    gx=j;
                }
                else if(field[i][j]==2){
                    sy=i;
                    sx=j;
                }
                else if(field[i][j]==4){
                    mx=j;
                    my=i;
                }
                if(field[i][j]!=1)
                    field[i][j]=0;
            }
        }
        queue<pair<int,pair<pair<int,int>,pair<int,int> > > > *prv=new queue<pair<int,pair<pair<int,int>,pair<int,int> > > > ();
        queue<pair<int,pair<pair<int,int>,pair<int,int> > > > *nxt=new queue<pair<int,pair<pair<int,int>,pair<int,int> > > > ();
        prv->push(make_pair(0,make_pair(make_pair(sy,sx),make_pair(my,mx))));
        bool passed[100][10][10][10][10];
        memset(passed,0,sizeof(passed));
        passed[0][sy][sx][my][mx]=true;
        int time=0;
        const int INF=1000000000;
        int minTime=INF;
        while(prv->size()){
            while(prv->size()){
                pair<int,int> ccp=prv->front().second.first;
                pair<int,int> cmp=prv->front().second.second;
                int cnt=prv->front().first;
                prv->pop();
                if(ccp.first==gy&&ccp.second==gx)
                    minTime=min(minTime,cnt);
                // lðSÉl¦é
                for(int i = 0; i < 4; i++){
                    int ny=dy[i]+cmp.first;
                    int nx=dx[i]+cmp.second;
                    if(ny>=0&&nx>=0&&nx<w&&ny<h&&field[ny][nx]==0){
                        // »ÌêÉ×¨ª é©Ç¤©
                        if(!(ccp.first==ny&&ccp.second==nx)){
                            if(!passed[cnt][ccp.first][ccp.second][ny][nx]){
                                passed[cnt][ccp.first][ccp.second][ny][nx]=true;
                                nxt->push(make_pair(cnt,make_pair(ccp,make_pair(ny,nx))));
                            }
                        }
                        // ×¨ª éÈçA×¨ð®©¹éêA®©·
                        else{
                            int nccy=ccp.first+dy[i];
                            int nccx=ccp.second+dx[i];
                            if(cnt<99&&nccy>=0&&nccx>=0&&nccy<h&&nccx<w&&field[nccy][nccx]==0){
                                if(!passed[cnt+1][nccy][nccx][ny][nx]){
                                    passed[cnt+1][nccy][nccx][ny][nx]=true;
                                    nxt->push(make_pair(cnt+1,make_pair(make_pair(nccy,nccx),make_pair(ny,nx))));
                                }
                            }
                        }
                    }
                }
            }
            time++;
            swap(prv,nxt);
        }
        if(minTime==INF)cout<<-1<<endl;
        else cout<<minTime<<endl;
        delete prv;
        delete nxt;
    }

    return 0;
}

Measured memory_bytes: 1892