#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
int in[maxn];
int ou[maxn];
int fa[maxn];
int letter[maxn];
string a[maxn];
struct edge
{
int to, next;
string w;
}e[maxn];
int head[maxn];
int n, set_count, cnt = 1;
int cmp(string a, string b)
{
return a > b;
}
void add(int a, int b, string c)
{
e[cnt].to = b;
e[cnt].w = c;
e[cnt].next = head[a];
head[a] = cnt++;
}
void terminates()
{
cout << "***\n";
exit(0);
}
int find(int x)
{
if (fa[x] == x) return x;
return fa[x] = find(fa[x]);
}
void unions(int a, int b)
{
fa[find(a)] = find(b);
}
int vis[maxn];
vector<string> ans;
void dfs(int st, int now)
{
if (st == n)
{
for (int i = 0; i < ans.size(); i++)
{
cout << ans[i];
if (i != ans.size() - 1)cout << ".";
}
exit(0);
}
for (int i = head[now]; i; i = e[i].next)
{
if (vis[i]) continue;
vis[i] = 1;
ans.push_back(e[i].w);
dfs(st + 1, e[i].to);
vis[i] = 0;
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++)
{
int ch_start = a[i][0] - 'a' + 1;
int ch_end = a[i][a[i].size() - 1] - 'a' + 1;
in[ch_end]++;
ou[ch_start]++;
add(ch_start, ch_end, a[i]);
if (!letter[ch_start])
{
set_count++;
letter[ch_start] = 1;
fa[ch_start] = ch_start;
}
if (!letter[ch_end])
{
set_count++;
letter[ch_end] = 1;
fa[ch_end] = ch_end;
}
if (ch_start != ch_end)
{
int stf = find(ch_start);
int edf = find(ch_end);
if (stf != edf)
{
set_count--;
unions(stf, edf);
}
}
}
if (set_count != 1)
{
terminates();
}
int eular_start = 0;
int eular_end = 0;
for (int i = 1; i <= 27; i++)
{
if (!letter[i])
continue;
int f1 = 0;
if (ou[i]==in[i]+1)
{
if (f1 == 1)
terminates();
f1 = 1;
eular_start = i;
continue;
}
int f2 = 0;
if (in[i] == ou[i] + 1)
{
if (f2 == 1)
terminates();
f2 = 1;
eular_end = i;
continue;
}
if (in[i] == ou[i])
continue;
terminates();
}
if ((eular_start && !eular_end) || (!eular_start && eular_end))
{
terminates();
}
if (!eular_start)eular_start = a[1][0] - 'a' + 1;
dfs(0, eular_start);
return 0;
}