#include<iostream>
using namespace std;
#include<string>
#include<map>
#include<algorithm>
#include<cstring>
int n, vis[1005], tot, sum, flag;
map<char, int>m1, m2;
string a[1005], ans[1005];
void dfs(int x)
{
if (flag) return;
if (sum == n)
{
flag = 1;
return;
}
for (int i = 1; i <= n; i++)
{
if (vis[i])
{
continue;
}
if (a[x][a[x].length() - 1] == a[i][0])
{
sum++;
ans[++tot] = a[i];
vis[i] = 1;
dfs(i);
if (flag) return;
sum--;
tot--;
vis[i] = 0;
}
}
}
int main()
{
cin >> n;
for (char i = 1; i <= n; i++)
{
cin >> a[i];
m1[a[i][0]]++;
m2[a[i][a[i].length() - 1]]++;
}
sort(a + 1, a + 1 + n);
char s = '*', t = '*';
for (char i = 'a'; i <= 'z'; i++)
{
if (m1[i] - m2[i] == 1)
{
s = i;
}
if (m2[i] - m1[i] == 1)
{
t = i;
}
}
int cnt = m2[t];
if (s == '*' && t == '*')
{
for (int i = 1; i <= n; i++)
{
memset(vis, 0, sizeof(vis));
sum = 1;
flag = 0;
tot = 0;
ans[0] = a[i];
vis[i] = 1;
dfs(i);
if (sum == n)
{
for (int i = 0; i < n - 1; i++)
{
cout << ans[i] << '.';
}
cout << ans[n - 1];
return 0;
}
}
}
else
{
for (int i = 1; i <= n; i++)
{
if (a[i][0] == s && (a[i][a[i].length() - 1] != t || cnt != 1))
{
memset(vis, 0, sizeof(vis));
sum = 1;
flag = 0;
tot = 0;
vis[i] = 1;
dfs(i);
ans[0] = a[i];
if (sum == n)
{
for (int i = 0; i < n - 1; i++)
{
cout << ans[i] << '.';
}
cout << ans[n - 1];
return 0;
}
}
}
}
cout << "***";
return 0;
}