#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 1010
#define N 26
int G[N + 5][N + 5],v_cnt,vis[N + 5],n,in_dge[N + 5],out_dge[N + 5],point[N + 5];
void check_dfs(int u) {
vis[u] = 1;
v_cnt--;
for(int i = 1; i <= N; ++i) {
if(!vis[i] && G[u][i]) check_dfs(i);
if(!v_cnt) break;
}
}
int main(void)
{
//freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int num;
while(cin >> n) {
while(n--) {
cin >> num;
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
memset(in_dge,0,sizeof(in_dge));
memset(out_dge,0,sizeof(out_dge));
memset(point,0,sizeof(point));
char s[Maxn]; int u,v,len;
v_cnt = 0; // 顶点数
for(int i = 1; i <= num; ++i) {
cin >> s;
len = strlen(s);
u = s[0] - 'a' + 1; v = s[len - 1] - 'a' + 1;
if(!G[u][v]) { G[u][v] = 1; G[v][u] = 1; }
if(!point[u]) { v_cnt++; point[u] = 1; } //计录一共有多少个不同的顶点
if(!point[v]) { v_cnt++; point[v] = 1; }
out_dge[u]++; in_dge[v]++;
}
int cnt_1 = 0, cnt_2 = 0,cnt_3 = 0;
for(int i = 1; i <= N; ++i) {
if(out_dge[i] != in_dge[i]) { //欧拉图的定理
cnt_3++;
if(out_dge[i] - 1 == in_dge[i]) cnt_1 = 1;
else if(out_dge[i] == in_dge[i] - 1) cnt_2 = 1;
}
}
int cnt = cnt_1 + cnt_2;
if((cnt == cnt_3 && cnt_3 == 2 ) || !cnt_3) { // 这里千万不要写成 cnt == cnt_3 == 2 因为比较的意义跟你想的不同
// 计算机的判断是 cnt == cnt_3 == true == 1 ,然而 1 != 2;
check_dfs(u); // 判断是否为连接图,遍历每个顶点,判断遍历的顶点数是否等于全部的顶点数v_cnt
if(!v_cnt) cout << "Ordering is possible." << endl;
else cout << "The door cannot be opened." << endl;
}
else cout << "The door cannot be opened." << endl;
}
}
return 0;
}