#include<bits/stdc++.h>
#define ll long long
#define MAXN 1010
#define End cout<<"***";return 0;
using namespace std;
inline ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;}
inline void write(ll x){if(x==0){putchar('0');return;}if(x<0){putchar('-');x=-x;}char s[22];ll tmp=x,cnt=0;while(tmp>0){s[cnt++]=tmp%10+'0';tmp/=10;}while(cnt>0) putchar(s[--cnt]);}
ll n,in[MAXN],out[MAXN],dad[MAXN],piece,top;
string input[MAXN],st[MAXN];
bool vis[MAXN],use[MAXN];
struct Edge{
ll to,id;
string word;
};
vector<Edge> edge[MAXN];
bool cmp(string x,string y){
return x<y;
}
ll find(ll x){
if(dad[x]==x) return x;
return dad[x]=find(dad[x]);
}
void make_set(ll x){
if(!vis[x]){
piece++;
vis[x]=1;
dad[x]=x;
}
}
void dfs(ll x,ll id){
for(int i=0;i<edge[x].size();i++){
if(use[edge[x][i].id]) continue;
use[edge[x][i].id]=1;
st[++top]=edge[x][i].word;
dfs(edge[x][i].to,edge[x][i].id);
}
}
bool check(ll x,ll y,ll z){
if(x==y&&x==1) return 1;
if(z==n) return 1;
return 0;
}
int main(){
n=read();
for(int i=1;i<=n;i++) cin>>input[i];
sort(input+1,input+n+1,cmp);
for(int i=1;i<=n;i++){
ll f=input[i][0]-'a'+1,e=input[i][input[i].size()-1]-'a'+1;
out[f]++,in[e]++;
make_set(f),make_set(e);
ll dad_f=find(f),dad_e=find(e);
if(dad_f!=dad_e){
piece--;
dad[dad_f]=dad[dad_e];
}
edge[f].push_back((Edge){e,i,input[i]});
}
if(piece>1){End}
ll sta,end,equ=0,S=0,E=0;
for(int i=1;i<=30;i++){
if(vis[i]){
if(in[i]-out[i]==1){
end=i;
E++;
}
if(in[i]-out[i]==-1){
sta=i;
S++;
}
if(in[i]==out[i]) equ++;
if(in[i]-out[i]!=1&&in[i]-out[i]!=-1&&in[i]!=out[i]){End}
}
}
if(!check(S,E,equ)){End}
if(!S) sta=input[1][0]-'a'+1;
dfs(sta,0);
if(top<n){End}
if(top==n){
for(int i=1;i<=n;i++){
cout<<st[i];
if(i<n) cout<<".";
}
}
return 0;
}