// #pragma GCC target("avx2") #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include // #include // #include using namespace std; // using mint = atcoder::modint998244353; using P = pair; const int M = 998244353; const long long LM = 1LL << 60; vector> solve(const vector& r, const vector& c) { int n = r.size(); if (n < 3) { vector> a(n, vector(n)); bool ok = true; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { ok &= r[i] == c[j]; a[i][j] = r[i]; } } if (ok) { return a; } else { return {}; } } bool same = true; for (int i = 0; i < n; ++i) { same &= c[i] == c[0]; } if (same) { if (n < 5) { return {}; } vector> a(n, vector(n)); int k = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { a[i][j] = r[i]; } if (r[i] != c[0]) { for (int _ = 0; _ < 2; ++_) { a[i][k] = c[0]; k = (k + 1) % n; } } } return a; } vector to(n); int j = -1; for (int i = 0; i < n; ++i) { to[i] = i; if (r[i] == c[to[i]]) { if (j == -1) { j = i; } else { swap(to[i], to[j]); j = -1; } } } if (j != -1) { for (int i = 0; i < n; ++i) { if (c[to[j]] != c[to[i]]) { swap(to[i], to[j]); j = -1; break; } } } assert(j == -1); vector> a(n, vector(n)); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { a[i][j] = r[i]; } a[i][to[i]] = c[to[i]]; } return a; } int main() { cin.tie(0); ios::sync_with_stdio(0); int T; cin >> T; for (int _ = 0; _ < T; ++_) { int n; cin >> n; vector r(n), c(n); for (int i = 0; i < n; ++i) { cin >> r[i]; --r[i]; } for (int i = 0; i < n; ++i) { cin >> c[i]; --c[i]; } auto b = solve(r, c); // cout << b.size() << '\n'; if (b.empty()) { cout << -1 << '\n'; } else { for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cout << b[i][j] + 1 << (j + 1 < n ? ' ' : '\n'); } } } } return 0; }