#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int N; cin >> N; vector R(N), C(N), pos(N + 1); for (int i = 0; i < N; ++i) cin >> R[i], pos[R[i]] = i; for (int& x : C) cin >> x; if (N == 1) { cout << "1\n"; continue; } if (N == 2) { cout << "-1\n"; continue; } vector row(N), forbidden(N); for (int j = 0; j < N; ++j) forbidden[j] = pos[C[j]]; if (count(C.begin(), C.end(), C[0]) == N) { if (N < 5) { cout << "-1\n"; continue; } vector other; for (int i = 0; i < N; ++i) if (i != forbidden[0]) other.push_back(i); for (int j = 0; j < N; ++j) row[j] = other[j % (N - 1)]; } else { vector unused(N, 1); for (int j = 0; j + 1 < N; ++j) { for (int i = 0; i < N; ++i) { if (unused[i] && i != forbidden[j]) { row[j] = i; unused[i] = 0; break; } } } int last = find(unused.begin(), unused.end(), 1) - unused.begin(); if (last != forbidden.back()) { row.back() = last; } else { int j = 0; while (forbidden[j] == last) ++j; row.back() = row[j]; row[j] = last; } } vector> A(N, vector(N)); for (int i = 0; i < N; ++i) fill(A[i].begin(), A[i].end(), R[i]); for (int j = 0; j < N; ++j) A[row[j]][j] = C[j]; for (auto& a : A) { for (int j = 0; j < N; ++j) cout << a[j] << " \n"[j + 1 == N]; } } }