#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=25;
int arr[maxn][maxn];//n*n矩阵
int a[maxn];//西->东
int b[maxn];//北->南
int n;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool vis[maxn][maxn];
struct Point{
int x,y;
//记录到达每个点的路径
string road;
Point(){}
Point(int xx,int yy){
x=xx;
y=yy;
}
};
bool check(){
for(int i=0;i<n;i++)
if(a[i]!=0||b[i]!=0)
return false;
return true;
}
void dfs(Point p){
if(p.x==n-1&&p.y==n-1){
if(check())
cout<<p.road<<endl;
return;
}
for(int i=0;i<4;i++){
int dx=p.x+dir[i][0];
int dy=p.y+dir[i][1];
if(dx>=0&&dx<n&&dy>=0&&dy<n&&!vis[dx][dy]&&a[dy]!=0&&b[dx]!=0){
Point next;
next.x=dx;
next.y=dy;
string nextroad=to_string(arr[dx][dy]);
next.road=p.road+" "+nextroad;
vis[dx][dy]=true;
a[dy]--;
b[dx]--;
dfs(next);
//状态回溯
vis[dx][dy]=false;
a[dy]++;
b[dx]++;
}
}
}
int main(){
cin>>n;
int temp=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
arr[i][j]=temp++;
}
}
for(int j=0;j<n;j++){
cin>>a[j];
}
for(int i=0;i<n;i++){
cin>>b[i];
}
//初始化第一个点
Point pp;
pp.x=pp.y=0;
pp.road="0";
vis[0][0]=true;
a[0]--;
b[0]--;
dfs(pp);
return 0;
}