import sys it = iter(map(int, sys.stdin.buffer.read().split())) out = [] for _ in range(next(it)): n = next(it) values = [next(it) % n for _ in range(n * n)] if sum(values) % n: out.append("-1") continue size, order = n * n, [] if n % 2 == 0: order.extend(range(n)) for r in range(1, n): order.extend(range(r * n + n - 1, r * n, -1) if r % 2 else range(r * n + 1, r * n + n)) order.extend(range(size - n, 0, -n)) else: order.extend(range(n)) for c in range(n - 1, 1, -1): order.extend(range((n - 1) * n + c, c, -n) if (n - 1 - c) % 2 else range(n + c, size + c, n)) for r in range(n - 1, 0, -1): order.extend((r * n, r * n + 1) if (n - 1 - r) % 2 else (r * n + 1, r * n)) count, prefix = [0] * n, 0 for index, cell in enumerate(order): if not (n % 2 and index == 1): count[prefix] += 1 prefix = (prefix + values[cell]) % n residue, cuts, prefix = max(range(n), key=count.__getitem__), [], 0 for index, cell in enumerate(order): if not (n % 2 and index == 1) and prefix == residue: cuts.append(index) if len(cuts) == n: break prefix = (prefix + values[cell]) % n answer = [0] * size for label in range(n): left = cuts[label] right = cuts[(label + 1) % n] + (size if label == n - 1 else 0) for index in range(left, right): answer[order[index % size]] = label + 1 out.extend(" ".join(map(str, answer[r * n:(r + 1) * n])) for r in range(n)) print("\n".join(out))