"use strict"; // start var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); const fs = __importStar(require("node:fs")); function main() { // ここに処理を記述します let T = nextNum(); let ans = []; while (T--) { let N = nextNum(); let R = nextNums(N); let C = nextNums(N); if (N == 1) { ans.push(1); continue; } if (N == 2) { ans.push(-1); continue; } let f = true; for (let i = 1; i < N; i++) { if (C[i] != C[0]) f = false; } if (f && N <= 4) { ans.push(-1); continue; } let A = Array.from({ length: N }, (_, i) => Array(N).fill(R[i])); if (f) { let x = C[0]; let r = 0; while (R[r] != x) r++; let rows = []; for (let i = 0; i < N; i++) { if (i != r) rows.push(i); } for (let j = 0; j < N; j++) { let i = rows[j % rows.length]; A[i][j] = x; } } else { let row = Array.from({ length: N }, (_, i) => i); let bad = []; for (let j = 0; j < N; j++) { if (R[j] == C[j]) { bad.push(j); } } if (bad.length >= 2) { for (let k = 0; k < bad.length; k++) { row[bad[k]] = bad[(k + 1) % bad.length]; } } else if (bad.length == 1) { let b = bad[0]; let k = 0; while (k == b || C[k] == R[b]) k++; [row[b], row[k]] = [row[k], row[b]]; } for (let j = 0; j < N; j++) { let i = row[j]; A[i][j] = C[j]; } } for (let i = 0; i < N; i++) { ans.push(A[i].join(" ")); } } print(ans, "\n"); // 処理終了 } const less = (a, b) => (a == b ? 0 : a < b ? -1 : 1); const greater = (a, b) => (a == b ? 0 : a < b ? 1 : -1); const bigIntMax = (...args) => args.reduce((m, e) => (e > m ? e : m)); const bigIntMin = (...args) => args.reduce((m, e) => (e < m ? e : m)); const bigIntAbs = (arg) => (arg < 0 ? -arg : arg); /** * 説明: 非負 bigint n の床平方根 floor(sqrt(n)) を正確に返す。 * 使い方: let x = bigIntSqrt(n) * 計算量: O(log bit長) */ const bigIntSqrt = (n) => { if (n < 0n) { throw new RangeError("square root of negative bigint"); } if (n < 2n) return n; let bitLength = n.toString(2).length; let x = 1n << BigInt((bitLength + 1) >> 1); while (true) { let next = (x + n / x) >> 1n; if (next >= x) return x; x = next; } }; let inputs = ""; let inputArray; let currentIndex = 0; let outputBuffer = ""; let yes = "Yes"; let no = "No"; let MOD998244353 = 998244353; let small_a_code = 97; let big_A_code = 65; let dxy4 = [[-1, 0], [0, 1], [1, 0], [0, -1]]; let dxy8 = [[-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1]]; let dir4 = ["U", "R", "D", "L"]; // // インタラクティブ用 // // お決まりのインプットはコメントアウト、main関数にasyncを忘れない // // 詳しくは典型ABC305-Fをチェック // const readline = require("readline"); // const rl = readline.createInterface({ // input: process.stdin, // output: process.stdout, // }); // const it = rl[Symbol.asyncIterator](); // const nextAwait = async () => { // const { value } = await it.next(); // return value.trim(); // }; function next() { return inputArray[currentIndex++]; } function nextNum() { return +next(); } function nextBigInt() { return BigInt(next()); } function nexts(length) { const arr = []; for (let i = 0; i < length; ++i) arr[i] = next(); return arr; } function nextNums(length) { const arr = []; for (let i = 0; i < length; ++i) arr[i] = nextNum(); return arr; } function nextBigInts(length) { const arr = []; for (let i = 0; i < length; ++i) arr[i] = nextBigInt(); return arr; } function print(out, separator) { if (Array.isArray(out)) { outputBuffer += out.join(separator); } else { outputBuffer += out; } } function println(out, separator) { if (Array.isArray(out)) { print(out, separator || ""); } else { print(out); } print("\n"); } function flush() { if (outputBuffer.length == 0) return; console.log(outputBuffer.endsWith("\n") ? outputBuffer.slice(0, -1) : outputBuffer); } function intDiv(a, b) { return Math.trunc(a / b); } // end function readInput() { const g = globalThis; // Deno if (typeof g.Deno !== "undefined") { const chunks = []; const buf = new Uint8Array(1 << 16); while (true) { const n = g.Deno.stdin.readSync(buf); if (n === null) break; if (n > 0) chunks.push(buf.slice(0, n)); } const length = chunks.reduce((s, c) => s + c.length, 0); const bytes = new Uint8Array(length); let offset = 0; for (const c of chunks) { bytes.set(c, offset); offset += c.length; } return new TextDecoder().decode(bytes); } // Node.js / Bun return fs.readFileSync(0, "utf8"); } inputs = readInput(); inputArray = inputs.trim().split(/\s+/); main(); flush(); /** * https://github.com/occhanCode/atcoder-templates/blob/main/src/main.ts */ //# sourceMappingURL=main.js.map