#include using namespace std; #ifdef TEMPURA #else #define debug(...) ((void)0) #define msg(...) ((void)0) #endif #define rep(i, n) for(int i = 0; i < (int)(n); i++) #define REP(i, m, n) for(int i = (int)(m); i < (int)(n); i++) using ll = long long; using ull = unsigned long long; using i128 = __int128_t; template inline bool chmin(T &a, T b) { if(a > b) { a = b; return true; } return false; } template inline bool chmax(T &a, T b) { if(a < b) { a = b; return true; } return false; } // #include // using mint = atcoder::modint998244353; void solve() { int n; cin >> n; vector> ords; { vector ord; rep(i, n) { if(i % 2 == 0) { rep(j, n) ord.push_back(i * n + j); } else { rep(j, n) ord.push_back(i * n + n - 1 - j); } } ords.push_back(ord); } { vector ord; rep(i, n) { if(i % 2 == 1) { rep(j, n) ord.push_back(i * n + j); } else { rep(j, n) ord.push_back(i * n + n - 1 - j); } } ords.push_back(ord); } { vector ord; rep(i, n) { if(i % 2 == 0) { rep(j, n) ord.push_back(j * n + i); } else { rep(j, n) ord.push_back((n - 1 - j) * n + i); } } ords.push_back(ord); } { vector ord; rep(i, n) { if(i % 2 == 1) { rep(j, n) ord.push_back(j * n + i); } else { rep(j, n) ord.push_back((n - 1 - j) * n + i); } } ords.push_back(ord); } vector a(n * n); rep(i, n * n) cin >> a[i]; int s = 0; rep(i, n * n) s += a[i]; if(s % n != 0) { cout << -1 << endl; return; } for(auto ord : ords) { vector sum(n * n + 1); rep(i, n * n) { sum[i + 1] = (sum[i] + a[ord[i]]) % n; } vector cnt(n); rep(i, n * n) { cnt[sum[i]] += 1; } if(cnt[0] < n) { continue; } vector ans(n * n); int cur = 1; rep(i, n * n) { ans[ord[i]] = cur; if(sum[i + 1] == 0) { cur = min(n, cur + 1); } } rep(i, n * n) { cout << ans[i] << " \n"[i % n == n - 1]; } return; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin >> t; while(t--) { solve(); } }