//42
#include<iostream>
#include<algorithm>

using namespace std;

int main(){
  for(int w,h;cin>>w>>h,w|h;){
    int g[7][7];
    int wx,wy,cx,cy,gx,gy;
    for(int i=0;i<h;i++){
      for(int j=0;j<w;j++){
	cin>>g[i][j];
	if(g[i][j]==2){
	  cx=j;
	  cy=i;
	}else if(g[i][j]==4){
	  wx=j;
	  wy=i;
	}else if(g[i][j]==3){
	  gx=j;
	  gy=i;
	}
      }
    }
    int d[7][7][7][7];
    fill(d[0][0][0],d[7][0][0],1<<30);
    d[cy][cx][wy][wx]=0;
    for(int i=0;i<w*w*h*h;i++){
      for(int j=0;j<h;j++){
	for(int k=0;k<w;k++){
	  for(int l=0;l<h;l++){
	    for(int m=0;m<w;m++){
	      for(int n=0;n<4;n++){
		int dd[]={0,1,0,-1,0};
		int ny=l+dd[n];
		int nx=m+dd[n+1];
		if(0<=nx&&nx<w&&0<=ny&&ny<h&&g[ny][nx]!=1){
		  if(ny!=j||nx!=k){
		    d[j][k][ny][nx]=min(d[j][k][ny][nx],d[j][k][l][m]);
		  }else{
		    int nny=ny+dd[n];
		    int nnx=nx+dd[n+1];
		    if(0<=nny&&nny<h&&0<=nnx&&nnx<w&&g[nny][nnx]!=1){
		      d[nny][nnx][ny][nx]=min(d[nny][nnx][ny][nx],d[j][k][l][m]+1);
		    }
		  }
		}
	      }
	    }
	  }
	}
      }
    }
    int me=*min_element(d[gy][gx][0],d[gy][gx+1][0]);
    cout<<((me==1<<30)?-1:me)<<endl;
  }
  return 0;
}