#include using namespace std; int main(){ cin.tie(0); ios_base::sync_with_stdio(0); //start here int tt;cin >> tt; while(tt--){ int N;cin >> N; vector R(N); vector C(N); for(auto &i:R) cin >> i; for(auto &i:C) cin >> i; if(N == 1){ if(R[0] == C[0]) { cout << R[0] << '\n'; }else{ cout << "-1\n"; } continue; }else if(N == 2){ cout << "-1\n"; continue; } vector> grid(N,vector(N,0)); auto print_ans = [&](){ for(auto &i:grid){ for(auto &j:i) cout << j << " "; cout << '\n'; } }; vector loc(N+1); for(int i = 0;i < N;i++){ loc[R[i]] = i; } for(int i = 0;i < N;i++){ for(int j = 0;j < N;j++){ grid[i][j] = R[i]; } } if(N <= 4){ vector perm; for(int i = 1;i <= N;i++) perm.push_back(i); bool findAns = false; do{ bool valid = true; for(int i = 0;i < N;i++) { if(perm[i] == C[i]) valid = false; } if(valid == true){ for(int i = 0;i < N;i++){ grid[loc[perm[i]]][i] = C[i]; } print_ans(); findAns = true; break; } }while(next_permutation(perm.begin(),perm.end())); if(!findAns) cout << "-1\n"; continue; } priority_queue> pq; for(int i = 1;i <= N;i++) pq.push({(N-1)/2,i}); for(int i = 0;i < N;i++){ vector> after; while(true){ auto [remain,x] = pq.top(); pq.pop(); if(x == C[i]){ after.push_back({remain,x}); continue; }else{ remain--; grid[loc[x]][i] = C[i]; after.push_back({remain,x}); break; } } for(auto tk:after) pq.push(tk); } print_ans(); } }