#include using namespace std; #define all(v) (v).begin(),(v).end() #define pb emplace_back #define rep(i, n) for(int i=0;i<(n);i++) #define foa(e, v) for(auto& e : v) #define dout(a) cout< using pqr = priority_queue, greater>; template inline bool chmax(T1 &a, T2 b) { bool compare = a < b; if(compare) a = b; return compare; } template inline bool chmin(T1 &a, T2 b) { bool compare = a > b; if(compare) a = b; return compare; } template inline T back(std::set &s) { return *s.rbegin(); } template inline T back(std::multiset &s) { return *s.rbegin(); } template inline T pop_back(std::set &s) { auto it = prev(s.end()); T val = *it; s.erase(it); return val; } template inline T pop_back(std::multiset &s) { auto it = prev(s.end()); T val = *it; s.erase(it); return val; } const int dy[8] = {-1, 0, 0, 1, 1, -1, 1, -1}; const int dx[8] = {0, -1, 1, 0, -1, -1, 1, 1}; const ll MOD7 = 1000000007, MOD998 = 998244353, INF = (3LL << 59); const int inf = 1 << 30; const char br = '\n'; #include using namespace atcoder; void solve() { int n; cin >> n; vector r(n), c(n), inv(n); rep(i, n) { cin >> r[i]; r[i] --; inv[r[i]] = i; } rep(i, n) { cin >> c[i]; c[i] --; // c[i] = inv[c[i]]; } if(n == 2) { cout << -1 << endl; return; } { set st; foa(e, c) st.insert(e); if((int)st.size() == 1) { cout << -1 << endl; return; } } vector a(n, vector(n, 0)); rep(i, n) rep(j, n) { a[i][j] = r[i]; } mf_graph g(n + n + 2); int S = n + n; int T = S + 1; rep(i, n) { g.add_edge(S, i, 1); g.add_edge(i + n, T, 1); rep(j, n) { if(r[i] != c[j]) g.add_edge(i, j + n, 1); } } g.flow(S, T); auto edges = g.edges(); for(auto e: edges) { if(e.flow == 0 or e.from == S or e.to == T) { continue; } a[e.from][e.to - n] = c[e.to - n]; } rep(i, n) { foa(e, a[i]) cout << e + 1 << " "; cout << endl; } } int main() { cin.tie(0); ios::sync_with_stdio(false); int testcase = 1; cin >> testcase; while(testcase --) solve(); return 0; }