#include<bits/stdc++.h>
using namespace std;
#define PI acos(-1)
#define hell 1000000007
#define HELL 998244353
#define io ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define fix(n) cout << fixed << setprecision(n)
#define mset(a,n) memset(a,n,sizeof a)
#define rep(i,a,b) for (__typeof((b)) i=(a);i<(b);i++)
#define repp(i,a,b,p) for(__typeof((b)) i=(a);i<(b);i+=p)
#define ren(i,a,b) for(__typeof((a)) i=(a);i>=(b);i--)
#define renn(i,a,b,p) for(__typeof((a) i=(a);i>=(b);i-=p)
#define ADD(a,b,c) ((a)%c+(b)%c)%c
#define SUB(a,b,c) ((a)%c-(b)%c+c)%c
#define MUL(a,b,c) (((a)%c)*((b)%c))%c
#define lbd lower_bound
#define ubd upper_bound
#define ll long long
#define ld long double
#define pb push_back
#define fi first
#define se second
#define vll vector<ll>
#define pll pair<ll,ll>
#define vpll vector<pll>
#define all(v) (v).begin(), (v).end()
#define sz(x) (ll)x.size()
#define endl "\n"
#define out(n) cout<<n<<" "
#define outl(n) cout<<n<<endl
#define line cout<<endl
#define bug(n) {outl(n);return;}
#define N 2505
ll n,f=0;
string s,t,ans="ZZZZZZZZZZZZZZZZ";
set<string> m;
vector<string> a;
bool check(ll i, char b[][4], ll j){
if(j>=4){
rep(k,0,4){
if(b[k][j-4]=='-'||b[k][j-4]==a[i][k]){}
else return 0;
}
}else{
rep(k,0,4){
if(b[j][k]=='-'||b[j][k]==a[i][k]){}
else return 0;
}
}
return 1;
}
void fun(ll i, char b[][4], vll v){
if(i==n){
string res;
rep(i,0,4){
rep(j,0,4)res+=b[i][j];
}
ans=min(ans,res);
f=1;
return;
}
rep(j,0,8){
if(!v[j]){
if(check(i,b,j)){
char temp[4][4];
rep(i,0,4){
rep(j,0,4)temp[i][j]=b[i][j];
}
if(j>=4){
rep(k,0,4)b[k][j-4]=a[i][k];
}else{
rep(k,0,4)b[j][k]=a[i][k];
}
v[j]=1;
fun(i+1,b,v);
v[j]=0;
rep(i,0,4){
rep(j,0,4)b[i][j]=temp[i][j];
}
}
}
}
}
bool check2(vector<string> a, vector<string> b){
vector<string> c;
rep(j,0,4){
string s;
rep(i,0,4)s+=a[i][j];
c.pb(s);
}
ll C=0;
for(auto i:b){
if(find(all(c),i)!=c.end())C++;
else{
reverse(all(i));
if(find(all(c),i)!=c.end())C++;
}
}
return C==sz(b);
}
void fun2(ll i, vll v){
if(sz(v)==4){
do{
vector<string> V;
for(auto i:v)V.pb(a[i]);
rep(k,0,16){
rep(i,0,4){
if((k&(1ll<<i)))reverse(all(V[i]));
}
vector<string> W;
rep(i,0,n){
if(find(all(v),i)==v.end())W.pb(a[i]);
}
if(check2(V,W)){
string res;
for(auto i:V)res+=i;
ans=min(ans,res);
res="";
rep(j,0,4){
rep(i,0,4)res+=V[i][j];
}
ans=min(ans,res);
}
rep(i,0,4){
if((k&(1ll<<i)))reverse(all(V[i]));
}
}
}while(next_permutation(all(v)));
return;
}
if(i==n)return;
fun2(i+1,v);
v.pb(i);
fun2(i+1,v);
}
void solve(){
cin>>n;
m.clear();
a.clear();
ans="ZZZZZZZZZZZZZZZZ";
rep(i,0,n){
cin>>s;
t=s;
reverse(all(t));
if(m.count(s)||m.count(t)){}
else m.insert(s);
}
for(auto i:m)a.pb(i);
n=sz(a);
f=0;
if(n>=7){
vll v;
fun2(0,v);
}else if(n==6){
}else{
char b[4][4];
rep(i,0,4){
rep(j,0,4)b[i][j]='-';
}
vll v(8,0);
fun(0,b,v);
}
if(!f)ans="gridsnotpossible";
rep(i,0,4){
rep(j,0,4)cout<<ans[4*i+j];
line;
}
line;
}
void prep(){
}
int main(){
io;
ll t=1;
cin>>t;
prep();
fix(12);
while(t--)
solve();
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgUEkgYWNvcygtMSkKI2RlZmluZSBoZWxsIDEwMDAwMDAwMDcKI2RlZmluZSBIRUxMIDk5ODI0NDM1MwojZGVmaW5lIGlvIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpO2Npbi50aWUoMCk7Y291dC50aWUoMCkKI2RlZmluZSBmaXgobikgY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24obikKI2RlZmluZSBtc2V0KGEsbikgbWVtc2V0KGEsbixzaXplb2YgYSkKI2RlZmluZSByZXAoaSxhLGIpIGZvciAoX190eXBlb2YoKGIpKSBpPShhKTtpPChiKTtpKyspCiNkZWZpbmUgcmVwcChpLGEsYixwKSBmb3IoX190eXBlb2YoKGIpKSBpPShhKTtpPChiKTtpKz1wKQojZGVmaW5lIHJlbihpLGEsYikgZm9yKF9fdHlwZW9mKChhKSkgaT0oYSk7aT49KGIpO2ktLSkKI2RlZmluZSByZW5uKGksYSxiLHApIGZvcihfX3R5cGVvZigoYSkgaT0oYSk7aT49KGIpO2ktPXApCiNkZWZpbmUgQUREKGEsYixjKSAoKGEpJWMrKGIpJWMpJWMKI2RlZmluZSBTVUIoYSxiLGMpICgoYSklYy0oYiklYytjKSVjCiNkZWZpbmUgTVVMKGEsYixjKSAoKChhKSVjKSooKGIpJWMpKSVjCiNkZWZpbmUgbGJkIGxvd2VyX2JvdW5kCiNkZWZpbmUgdWJkIHVwcGVyX2JvdW5kCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIHZsbCB2ZWN0b3I8bGw+CiNkZWZpbmUgcGxsIHBhaXI8bGwsbGw+CiNkZWZpbmUgdnBsbCB2ZWN0b3I8cGxsPgojZGVmaW5lIGFsbCh2KSAodikuYmVnaW4oKSwgKHYpLmVuZCgpCiNkZWZpbmUgc3ooeCkgKGxsKXguc2l6ZSgpCiNkZWZpbmUgZW5kbCAiXG4iCiNkZWZpbmUgb3V0KG4pIGNvdXQ8PG48PCIgIgojZGVmaW5lIG91dGwobikgY291dDw8bjw8ZW5kbAojZGVmaW5lIGxpbmUgY291dDw8ZW5kbAojZGVmaW5lIGJ1ZyhuKSB7b3V0bChuKTtyZXR1cm47fQojZGVmaW5lIE4gMjUwNQpsbCBuLGY9MDsKc3RyaW5nIHMsdCxhbnM9IlpaWlpaWlpaWlpaWlpaWloiOwpzZXQ8c3RyaW5nPiBtOwp2ZWN0b3I8c3RyaW5nPiBhOwpib29sIGNoZWNrKGxsIGksIGNoYXIgYltdWzRdLCBsbCBqKXsKCWlmKGo+PTQpewoJCXJlcChrLDAsNCl7CgkJCWlmKGJba11bai00XT09Jy0nfHxiW2tdW2otNF09PWFbaV1ba10pe30KCQkJZWxzZSByZXR1cm4gMDsKCQl9Cgl9ZWxzZXsKCQlyZXAoaywwLDQpewoJCQlpZihiW2pdW2tdPT0nLSd8fGJbal1ba109PWFbaV1ba10pe30KCQkJZWxzZSByZXR1cm4gMDsKCQl9Cgl9CglyZXR1cm4gMTsKfQp2b2lkIGZ1bihsbCBpLCBjaGFyIGJbXVs0XSwgdmxsIHYpewoJaWYoaT09bil7CgkJc3RyaW5nIHJlczsKCQlyZXAoaSwwLDQpewoJCQlyZXAoaiwwLDQpcmVzKz1iW2ldW2pdOwoJCX0KCQlhbnM9bWluKGFucyxyZXMpOwoJCWY9MTsKCQlyZXR1cm47Cgl9CglyZXAoaiwwLDgpewoJCWlmKCF2W2pdKXsKCQkJaWYoY2hlY2soaSxiLGopKXsKCQkJCWNoYXIgdGVtcFs0XVs0XTsKCQkJCXJlcChpLDAsNCl7CgkJCQkJcmVwKGosMCw0KXRlbXBbaV1bal09YltpXVtqXTsKCQkJCX0KCQkJCWlmKGo+PTQpewoJCQkJCXJlcChrLDAsNCliW2tdW2otNF09YVtpXVtrXTsKCQkJCX1lbHNlewoJCQkJCXJlcChrLDAsNCliW2pdW2tdPWFbaV1ba107CgkJCQl9CgkJCQl2W2pdPTE7CgkJCQlmdW4oaSsxLGIsdik7CgkJCQl2W2pdPTA7CgkJCQlyZXAoaSwwLDQpewoJCQkJCXJlcChqLDAsNCliW2ldW2pdPXRlbXBbaV1bal07CgkJCQl9CgkJCX0KCQl9Cgl9Cn0KYm9vbCBjaGVjazIodmVjdG9yPHN0cmluZz4gYSwgdmVjdG9yPHN0cmluZz4gYil7Cgl2ZWN0b3I8c3RyaW5nPiBjOwoJcmVwKGosMCw0KXsKCQlzdHJpbmcgczsKCQlyZXAoaSwwLDQpcys9YVtpXVtqXTsKCQljLnBiKHMpOwoJfQoJbGwgQz0wOwoJZm9yKGF1dG8gaTpiKXsKCQlpZihmaW5kKGFsbChjKSxpKSE9Yy5lbmQoKSlDKys7CgkJZWxzZXsKCQkJcmV2ZXJzZShhbGwoaSkpOwoJCQlpZihmaW5kKGFsbChjKSxpKSE9Yy5lbmQoKSlDKys7CgkJfQoJfQoJcmV0dXJuIEM9PXN6KGIpOwp9CnZvaWQgZnVuMihsbCBpLCB2bGwgdil7CglpZihzeih2KT09NCl7CgkJZG97CgkJCXZlY3RvcjxzdHJpbmc+IFY7CgkJCWZvcihhdXRvIGk6dilWLnBiKGFbaV0pOwoJCQlyZXAoaywwLDE2KXsKCQkJCXJlcChpLDAsNCl7CgkJCQkJaWYoKGsmKDFsbDw8aSkpKXJldmVyc2UoYWxsKFZbaV0pKTsKCQkJCX0KCQkJCXZlY3RvcjxzdHJpbmc+IFc7CgkJCQlyZXAoaSwwLG4pewoJCQkJCWlmKGZpbmQoYWxsKHYpLGkpPT12LmVuZCgpKVcucGIoYVtpXSk7CgkJCQl9CgkJCQlpZihjaGVjazIoVixXKSl7CgkJCQkJc3RyaW5nIHJlczsKCQkJCQlmb3IoYXV0byBpOlYpcmVzKz1pOwoJCQkJCWFucz1taW4oYW5zLHJlcyk7CgkJCQkJcmVzPSIiOwoJCQkJCXJlcChqLDAsNCl7CgkJCQkJCXJlcChpLDAsNClyZXMrPVZbaV1bal07CgkJCQkJfQoJCQkJCWFucz1taW4oYW5zLHJlcyk7CgkJCQl9CgkJCQlyZXAoaSwwLDQpewoJCQkJCWlmKChrJigxbGw8PGkpKSlyZXZlcnNlKGFsbChWW2ldKSk7CgkJCQl9CgkJCX0KCQl9d2hpbGUobmV4dF9wZXJtdXRhdGlvbihhbGwodikpKTsKCQlyZXR1cm47Cgl9CglpZihpPT1uKXJldHVybjsKCWZ1bjIoaSsxLHYpOwoJdi5wYihpKTsKCWZ1bjIoaSsxLHYpOwp9CnZvaWQgc29sdmUoKXsKCWNpbj4+bjsKCW0uY2xlYXIoKTsKCWEuY2xlYXIoKTsKCWFucz0iWlpaWlpaWlpaWlpaWlpaWiI7CglyZXAoaSwwLG4pewoJCWNpbj4+czsKCQl0PXM7CgkJcmV2ZXJzZShhbGwodCkpOwoJCWlmKG0uY291bnQocyl8fG0uY291bnQodCkpe30KCQllbHNlIG0uaW5zZXJ0KHMpOwoJfQoJZm9yKGF1dG8gaTptKWEucGIoaSk7CgluPXN6KGEpOwoJZj0wOwoJaWYobj49Nyl7CgkJdmxsIHY7CgkJZnVuMigwLHYpOwoJfWVsc2UgaWYobj09Nil7CgoJfWVsc2V7CgkJY2hhciBiWzRdWzRdOwoJCXJlcChpLDAsNCl7CgkJCXJlcChqLDAsNCliW2ldW2pdPSctJzsKCQl9CgkJdmxsIHYoOCwwKTsKCQlmdW4oMCxiLHYpOwoJfQoJaWYoIWYpYW5zPSJncmlkc25vdHBvc3NpYmxlIjsKCXJlcChpLDAsNCl7CgkJcmVwKGosMCw0KWNvdXQ8PGFuc1s0Kmkral07CgkJbGluZTsKCX0KCWxpbmU7Cn0Kdm9pZCBwcmVwKCl7Cgp9CmludCBtYWluKCl7CiAgICBpbzsKICAgIGxsIHQ9MTsKICAgIGNpbj4+dDsKICAgIHByZXAoKTsKICAgIGZpeCgxMik7CiAgICB3aGlsZSh0LS0pCiAgICAgICAgc29sdmUoKTsKICAgIHJldHVybiAwOwp9