#include <bits/stdc++.h>
using namespace std;
using namespace std;
const int kMaxN = 55;
int T;
int tt;
int n;
vector<string> P, Q, QQ;
pair<int, int> cntP[kMaxN];
pair<int, int> cntQ[kMaxN];
vector<int> vec[kMaxN];
int p[kMaxN];
bool vis[kMaxN];
string ans;
int tot = 0;
void dfs(int now) {
if (now == n) {
if (n == 29) {
++tot;
cout << tot << '\n';
exit(0);
}
QQ.clear();
for (int i = 0; i < n * n; ++i) {
string s;
for (int j = 0; j < P[i].size(); ++j) {
s += p[P[i][j]];
}
QQ.emplace_back(s);
}
sort(QQ.begin(), QQ.end());
//for (string it : QQ) cout << it << ' ';
//cout << '\n';
if (QQ == Q) {
ans = "";
for (int i = 0; i < n; ++i) {
if (p[i] < 26) ans += 'a' + p[i];
else ans += 'A' + p[i] - 26;
}
return;
}
return;
}
for (auto it : vec[now]) {
if (!vis[it]) {
vis[it] = 1;
p[now] = it;
dfs(now + 1);
if (ans != "flag") return;
vis[it] = 0;
}
}
}
int main() {
//ios::sync_with_stdio(false);
//cin.tie(0), cout.tie(0);
cin >> T;
tt = T;
while (T--) {
cin >> n;
P.clear(), Q.clear();
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
int x = i * j;
string s;
if (x < n) {
s += x;
}
else {
s += x / n;
s += x % n;
}
P.emplace_back(s);
}
}
for (int i = 0; i < n * n; ++i) {
string s;
cin >> s;
for (int i = 0; i < s.size(); ++i) {
if ('a' <= s[i] && s[i] <= 'z') s[i] = s[i] - 'a';
else s[i] = s[i] - 'A' + 26;
}
Q.emplace_back(s);
}
sort(P.begin(), P.end());
sort(Q.begin(), Q.end());
//for (int i = 0; i < n * n; ++i) cout << P[i] << ' ';
//cout << '\n';
//for (int i = 0; i < n * n; ++i) cout << Q[i] << ' ';
//cout << '\n';
fill(cntP, cntP + n, make_pair(0, 0));
fill(cntQ, cntQ + n, make_pair(0, 0));
for (string it : P) {
++cntP[it[0]].first;
if (it.size() > 1) ++cntP[it[1]].first;
}
//cout << "( " << i << ' ' << cntP[i].first << ' ' << cntP[i].second << '\n';
for (string it : Q) {
++cntQ[it[0]].first;
if (it.size() > 1) cout << ()it[1] << ' ';
//if (it.size() > 1) ++cntQ[it[1]].first;
}
if (n == 29) {
cout << "into\n";
return 0;
}
//cout << ") " << i << ' ' << cntQ[i].first << ' ' << cntQ[i].second << '\n';
for (int i = 0; i < n; ++i) vec[i].clear();
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (cntP[i] == cntQ[j]) {
//cout << "* " << i << ' ' << j << '\n';
vec[i].emplace_back(j);
}
}
}
ans = "flag";
fill(vis, vis + n, 0);
dfs(0);
if (tt != 50) cout << ans << '\n';
}
return 0;
}