#include<bits/stdc++.h>
using namespace std;
int n,head=-1,tail=-1;
struct Word{
string s;
int b,e;
}word[1005];
vector<int> oute[26],ine[26];
bool used[1005];
bool cmp(Word a,Word b){
return a.s<b.s;
}
int fa[26];
void init(){
for(int i=0;i<26;i++){
fa[i]=i;
}
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int i,int j){
int x=find(i),y=find(j);
fa[y]=x;
}
bool check_connected(){
init();
for(int i=1;i<=n;i++){
if(used[i]==0){
merge(word[i].b,word[i].e);
}
}
int cnt=0;
for(int i=0;i<26;i++){
bool flag=0;
for(int j:oute[i]){
if(used[j]==0)flag=1;
}
for(int j:ine[i]){
if(used[j]==0)flag=1;
}
if(flag==1){
if(fa[i]==i)cnt++;
}
}
if(cnt<=1)return 1;
return 0;
}
bool check_Eular(){
if(!check_connected())return 0;
for(int i=0;i<26;i++){
int no=oute[i].size();
int ni=ine[i].size();
if(no==ni){
continue;
}
if(no==ni+1){
if(head==-1){
head=i;
continue;
}
}
if(ni==no+1){
if(tail==-1){
tail=i;
continue;
}
}
return 0;
}
if(head==-1){
for(int i=0;i<26;i++){
if(!oute[i].empty()){
head=tail=i;
break;
}
}
}
return 1;
}
int main()
{
cin>>n;
init();
for(int i=1;i<=n;i++){
string s;
cin>>s;
int len=s.length();
int h=s[0]-'a';
int t=s[len-1]-'a';
word[i]={s,h,t};
}
sort(word+1,word+1+n,cmp);
for(int i=1;i<=n;i++){
oute[word[i].b].push_back(i);
ine[word[i].e].push_back(i);
}
if(!check_Eular()){
cout<<"***"<<endl;
return 0;
}
int temp=head;
for(int i:oute[temp]){
if(used[i]==1)continue;
used[i]=1;
if(check_connected()){
cout<<word[i].s;
temp=word[i].e;
break;
}else{
used[i]=0;
}
}
while(true){
bool flag=0;
for(int i:oute[temp]){
if(used[i]==1)continue;
flag=1;
used[i]=1;
if(check_connected()){
cout<<'.'<<word[i].s;
temp=word[i].e;
break;
}else{
used[i]=0;
}
}
if(flag==0)break;
}
cout<<endl;
return 0;
}