题目传送门
#include<bits/stdc++.h>
using namespace std;
int m;
int n;
map<string,int> mp;
map<int,string> mp2;
struct lp{
string a;
int v;
};
vector<lp> g[114514];
int du[114514][2];
int top;
stack<int> ans;
int in[114514];
int del[114514];
int d[1000100];
void dot(int now){
d[now] = 1;
for(lp v:g[now]){
if(d[v.v])continue;
dot(v.v);
}
}
void dfs(int now)
{
for(int i=del[now];i<g[now].size();i=del[now])
{
del[now]=i+1;
dfs(g[now][i].v);
}
ans.push(now);
}
int S;
int cnt[10];
int tot = 1145;
bool cmp(string x,string y){
int len=min(x.size(),y.size());
for(register int i=0;i<len;++i){
if(x[i]<y[i]) return 1;
else if(x[i]>y[i]) return 0;
}
return x.size()<y.size();
}
bool cmp2(lp a,lp b){
return cmp(a.a,b.a);
}
string pp[114514];
char ll = 'a';
int main(){
cin>>m;
for(int i = 1;i <= m;i++){
string a;
cin>>a;
char st = a[0];
char en = a[a.size()-1];
tot++;
mp2[tot] = a;
ll = st;
string En = "";En+=en;
g[st].push_back(lp{a,tot});
g[tot].push_back(lp{En,int(en)});
du[st][1]++;
du[tot][1]++;
du[tot][0]++;
du[en][0]++;
}
for(int i = 'a';i <= 'z';i++){
sort(g[i].begin(),g[i].end(),cmp2);
}
S = 1;
dot(ll);
bool flag = 1;
for(int i='a';i<='z';i++)
{
if(du[i][1]!=du[i][0])
{
flag=0;
if(du[i][1]-du[i][0]==1) cnt[1]++,S=i;
else if(du[i][0]-du[i][1]==1) cnt[0]++;
else return puts("***"),0;
}
}
for(int i=1145+1;i<=tot;i++)
{
if(du[i][1]!=du[i][0])
{
flag=0;
if(!d[i]){
return puts("***"),0;
}
if(du[i][1]-du[i][0]==1) cnt[1]++,S=i;
else if(du[i][0]-du[i][1]==1) cnt[0]++;
else return puts("***"),0;
}
}
if((!flag)&&!(cnt[0]==cnt[1]&&cnt[0]==1)) return !puts("***"),0;
dfs(S);
int ges = 0;
while(!ans.empty()){
if(ans.top()>1145)pp[++ges] = mp2[ans.top()];
ans.pop();
}
for(int i = 1;i < ges;i++){
cout<<pp[i]<<".";
}
cout<<pp[ges];
return 0;
}