Problem: Given are an integer N and arrays S, T, U, and V, each of length N. Construct an N×N matrix a that satisfy the following conditions:

* a_{i,j} is an integer.
* 0 \leq a_{i,j} \lt 2^{64}.
* If S_{i} = 0, the bitwise AND of the elements in the i-th row is U_{i}.
* If S_{i} = 1, the bitwise OR of the elements in the i-th row is U_{i}.
* If T_{i} = 0, the bitwise AND of the elements in the i-th column is V_{i}.
* If T_{i} = 1, the bitwise OR of the elements in the i-th column is V_{i}.



However, there may be cases where no matrix satisfies the conditions.

Constraints

* All values in input are integers.
* 1 \leq N \leq 500
* 0 \leq S_{i} \leq 1
* 0 \leq T_{i} \leq 1
* 0 \leq U_{i} \lt 2^{64}
* 0 \leq V_{i} \lt 2^{64}

Input

Input is given from Standard Input in the following format:


N
S_{1} S_{2} ...  S_{N}
T_{1} T_{2} ...  T_{N}
U_{1} U_{2} ...  U_{N}
V_{1} V_{2} ...  V_{N}


Output

If there exists a matrix that satisfies the conditions, print one such matrix in the following format:


a_{1,1} ...  a_{1,N}
:
a_{N,1} ...  a_{N,N}


Note that any matrix satisfying the conditions is accepted.

If no matrix satisfies the conditions, print -1.

Examples

Input

2
0 1
1 0
1 1
1 0


Output

1 1
1 0


Input

2
1 1
1 0
15 15
15 11


Output

15 11
15 11

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
int n,a[2][555],b[2][555],is[2][555],dd[555][555],ans[555][555];
void jh()
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<i;j++)
		{
			swap(dd[i][j],dd[j][i]);
		}
	}
}
bool sl()
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			dd[i][j]=-1;
		}
	}
	for(int i=0;i<2;i++)
	{
		for(int j=0;j<n;j++)
		{
			int nw=is[i][j];
			if(a[i][j]!=nw)
			{
				for(int k=0;k<n;k++)
				{
					if(dd[j][k]==!nw)
					{
						return false;
					}
					dd[j][k]=nw;
				}
			}
		}
		jh();
	}
	for(int i=0;i<2;i++)
	{
		for(int j=0;j<2;j++)
		{
			for(int k=0;k<n;k++)
			{
				int nw=is[j][k];
				if(a[j][k]==nw)
				{
					vector<int>vv;
					bool ok=false;
					for(int l=0;l<n;l++)
					{
						if(dd[k][l]==-1)
						{
							vv.push_back(l);
						}
						if(dd[k][l]==nw)
						{
							ok=true;
						}
					}
					if(ok)
					{
						continue;
					}
					if(vv.size()==0)
					{
						return false;
					}
					if(vv.size()==1)
					{
						dd[k][vv[0]]=nw;
					}
				}
			}
			jh();
		}
	}
	vector<int>v1,v2;
	for(int i=0;i<n;i++)
	{
		bool fl=true;
		for(int j=0;j<n;j++)
		{
			if(dd[i][j]==-1)
			{
				fl=false;
			}
		}
		if(!fl)
		{
			v1.push_back(i);
		}
	}
	for(int j=0;j<n;j++)
	{
		bool fl=true;
		for(int i=0;i<n;i++)
		{
			if(dd[i][j]==-1)
			{
				fl=false;
			}
		}
		if(!fl)
		{
			v2.push_back(j);
		}
	}
	for(int i=0;i<v1.size();i++)
	{
		for(int j=0;j<v2.size();j++)
		{
			dd[v1[i]][v2[j]]=(i+j)%2;
		}
	}
	return true;
}
signed main()
{
	cin>>n;
	for(int i=0;i<2;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin>>a[i][j];
		}
	}
	for(int i=0;i<2;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin>>b[i][j];
		}
	}
	for(int bt=0;bt<64;bt++)
	{
		for(int i=0;i<2;i++)
		{
			for(int j=0;j<n;j++)
			{
				is[i][j]=b[i][j]>>bt&1;
			}
		}
		if(!sl())
		{
			cout<<-1<<endl;
			return 0;
		}
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				ans[i][j]|=1LL*(dd[i][j])<<bt;
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cout<<ans[i][j]<<' ';
		}
		cout<<endl;
	}
	return 0;
}