#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int par[30],in[30],out[30],first[30],res[1005],cnt,T,N,size;
struct A
{
char w[30];
}a[1005];
struct Edge
{
int v,next,flg;
}edge[1005];
void insert(int u,int v)
{
edge[size].v=v;
edge[size].next=first[u];
edge[size].flg=0;
first[u]=size++;
}
int cmp(A a1,A a2)
{
return strcmp(a1.w,a2.w)>0 ;
}
int find(int x)
{
if(par[x]!=x)
par[x]=find(par[x]);
return par[x];
}
void merge(int x,int y)
{
int a=find(x),b=find(y);
par[a]=b;
}
void init()
{
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(first,-1,sizeof(first)); size=0;
for(int i=0;i<30;i++) par[i]=i;
}
int slove()
{
int a=0,b=0,f=-1,s;
for(int i=0;i<26;i++)
if(in[i]+out[i])
{
if(in[i]-out[i]==1) a++;
if(out[i]-in[i]==1)
{
b++;s=i;
}
if(abs(in[i]-out[i])>1) return -1;
if(f==-1) f=find(i);
if(find(i)!=f) return -1;
}
if(a==1 && b==1) return s;
if(a==0 && b==0)
for(int i=0;i<26;i++)
if(in[i]) return i;
return -1;
}
void dfs(int u,int id)
{
for(int e=first[u];e!=-1;e=edge[e].next)
{
if(!edge[e].flg)
{
edge[e].flg=1;
dfs(edge[e].v,e);
}
}
res[++cnt]=id;
}
int main()
{
// freopen("test.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
init();
scanf("%d",&N);
for(int i=0;i<N;i++)
scanf("%s",a[i].w);
sort(a,a+N,cmp);
for(int i=0;i<N;i++)
{
int u=a[i].w[0]-'a',v=a[i].w[strlen(a[i].w)-1]-'a';
out[u]++; in[v]++;
merge(u,v); insert(u,v);
}
int flag;
if((flag=slove())!=-1)
{
cnt=-1; dfs(flag,-1);
for(int i=cnt-1;i>=0;i--)
printf("%s%c",a[res[i]].w,i==0?'\n':'.');
}
else printf("***\n");
}
return 0;
}