#include <cstdio>
#include <queue>
using namespace std;

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

class State
{
public:
	int x,y,cx,cy,c;
	State(int x, int y, int cx, int cy, int c)
	:x(x),y(y),cx(cx),cy(cy),c(c)
	{}
	
	bool operator<(const State& s) const
	{
		return c>s.c;
	}
};

int main()
{
	int w,h;
	while(scanf("%d%d", &w,&h), (w||h))
	{
		bool hs[7][7][7][7]={0};
		int f[7][7],sx,sy,cx,cy;
		
		for(int i=0; i<h; i++)
		for(int j=0; j<w; j++)
		{
			scanf("%d", &f[j][i]);
			if(f[j][i]==4)
			{
				sx=j;
				sy=i;
			}
			if(f[j][i]==2)
			{
				cx=j;
				cy=i;
			}
		}
		
		priority_queue<State> q;
		q.push(State(sx,sy,cx,cy,0));
		
		bool g=false;
		while(!q.empty())
		{
			State s=q.top(); q.pop();
			if(f[s.cx][s.cy]==3)
			{
				g=true;
				printf("%d\n", s.c);
				break;
			}
			
			for(int i=0; i<4; i++)
			{
				int tx=s.x+dx[i], ty=s.y+dy[i];
				int tcx=s.cx, tcy=s.cy, tc=s.c;
				if(tx<0||ty<0||tx>=w||ty>=h) continue;
				if(f[tx][ty]==1) continue;
				
				if(tx==s.cx&&ty==s.cy)
				{
					tcx+=dx[i], tcy+=dy[i];
					if(tcx<0||tcy<0||tcx>=w||tcy>=h) continue;
					if(f[tcx][tcy]==1) continue;
					tc++;
				}
				
				if(hs[tx][ty][tcx][tcy]) continue;
				hs[tx][ty][tcx][tcy]=1;
				
				q.push(State(tx,ty,tcx,tcy,tc));
			}
		}
		
		if(!g) puts("-1");
	}
}