#include using namespace std; void solve() { int N; cin >> N; vector R(N), C(N); for (auto &x : R) cin >> x; for (auto &x : C) cin >> x; if (N == 1) { cout << 1 << '\n'; return; } if (N == 2) { cout << -1 << '\n'; return; } // まず全ての行を R[i] で埋める vector> A(N, vector(N)); for (int i = 0; i < N; i++) { fill(A[i].begin(), A[i].end(), R[i]); } bool same = true; for (int j = 1; j < N; j++) { if (C[j] != C[0]) same = false; } if (same) { // C が全て同じ if (N <= 4) { cout << -1 << '\n'; return; } int x = C[0]; // R[i] != x の行を集める vector other; for (int i = 0; i < N; i++) { if (R[i] != x) other.push_back(i); } // 各列に x を1個追加する for (int j = 0; j < N; j++) { int i = other[j % (N - 1)]; A[i][j] = x; } } else { // 各列に異なる行を割り当てる vector p(N); iota(p.begin(), p.end(), 0); // R[p[j]] == C[j] となる列 vector bad; for (int j = 0; j < N; j++) { if (R[p[j]] == C[j]) { bad.push_back(j); } } int k = bad.size(); if (k >= 2) { // 失敗している列同士で循環させる for (int t = 0; t < k; t++) { p[bad[t]] = bad[(t + 1) % k]; } } else if (k == 1) { // 別の値を要求する列と交換 int b = bad[0]; for (int j = 0; j < N; j++) { if (C[j] != C[b]) { swap(p[b], p[j]); break; } } } // 各列の指定値を1つ追加 for (int j = 0; j < N; j++) { A[p[j]][j] = C[j]; } } // 出力 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (j) cout << ' '; cout << A[i][j]; } cout << '\n'; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) solve(); return 0; }