#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e3+10;
int n;
struct node{
string str;
char top,tail;
int len;
}edge[N];
vector<int> g[N];
int step[N],ans[N],vis[N],maxs=0;
bool cmp(node a,node b){return a.str<b.str;}
bool f=false;
void dfs(int t,int s,char tail){
bool flag=0;
for(int i=0;i<g[tail-'a'].size();i++){
int top_num=g[tail-'a'][i];
if(!vis[top_num]){
f=true;
vis[top_num]=1;
flag=1;
step[s]=top_num;
dfs(top_num,s+1,edge[top_num].tail);
}
}
if(!flag){
if(s>maxs){
for(int i=1;i<=s;i++) ans[i]=step[i];
maxs=s;
}
return;
}
}
signed main(){
cin.tie(0);cout.tie(0);
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++){
cin>>edge[i].str;
edge[i].len=edge[i].str.size();
edge[i].tail=edge[i].str[edge[i].len-1];
edge[i].top=edge[i].str[0];
g[edge[i].top-'a'].push_back(i);
}
sort(edge+1,edge+1+n,cmp);
for(int i=1;i<=n;i++){
memset(step,0,sizeof step);
memset(vis,0,sizeof vis);
vis[i]=1;
step[1]=i;
dfs(i,2,edge[i].tail);
step[1]=0;
vis[1]=0;
}
if(!f){
cout<<"***";
return 0;
}
for(int i=1;i<=maxs-2;i++) cout<<edge[ans[i]].str<<'.';
cout<<edge[ans[maxs-1]].str;
return 0;
}