#include<stdio.h>
#include<string.h>
#include<queue>
#include<functional>
struct S{int x1,y1,x2,y2,c;}s,t;
struct C:std::binary_function<S,S,int>{int operator()(S a,S b){return a.c>b.c;}};
int main()
{
	int h,w,m[9][9],d[8][8][8][8],i,j,V=63,a[]={0,1,0,-1,0};
	while(scanf("%d%d",&w,&h),w)
	{
		for(i=0;i<h+2;++i)m[i][0]=m[i][w+1]=1;
		for(j=0;j<w+2;++j)m[0][j]=m[h+1][j]=1;
		for(i=1;i<=h;++i)for(j=1;j<=w;++j)
			if(scanf("%d",&m[i][j]),m[i][j]==4)m[s.y1=i][s.x1=j]=0;
			else if(m[i][j]==2)m[s.y2=i][s.x2=j]=0;
		memset(d,V,16384);
		s.c=0;
		std::priority_queue<S,std::vector<S>,C>q;
		q.push(s);
		d[s.y1][s.x1][s.y2][s.x2]=0;
		while(q.size())
		{
			s=q.top();q.pop();
			for(i=0;i<4;++i)
			{
				t=s;
				t.x1+=a[i];
				t.y1+=a[i+1];
				if(m[t.y1][t.x1]==1)continue;
				if(t.y1==t.y2&&t.x1==t.x2)
				{
					if(m[t.y2+a[i+1]][t.x2+a[i]]==1)continue;
					t.x2+=a[i];
					t.y2+=a[i+1];
					t.c++;
					if(m[t.y2][t.x2]==3)
					{
						printf("%d\n",t.c);
						goto E;
					}
				}
				if(d[t.y1][t.x1][t.y2][t.x2]<=t.c)continue;
				d[t.y1][t.x1][t.y2][t.x2]=t.c;
				q.push(t);
			}
		}
		puts("-1");
E:;
	}
	return 0;
}