#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int n,ans[100010],cnt,in[60];
vector<int> G[60];
bool vis[60],answer,dis[60][60],oula;
char word[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
char getc(){
char c;
c=getchar();
while(1){
if('a'<=c && c<='z' || ('A'<=c && c<='Z'))return c;
c=getchar();
}
}
void make(){
for(int i=1;i<=n;i++){
char u,v;
int u1,v1;
u=getc(); v=getc();
if('A'<=u && u<='Z')u1=u-'A';
else u1=u-'a'+26;
if('A'<=v && v<='Z')v1=v-'A';
else v1=v-'a'+26;
in[u1]++; in[v1]++;
vis[u1]=vis[v1]=1;
G[u1].push_back(v1); G[v1].push_back(u1);
}
}
bool check(){
int sum=0;
for(int i=0;i<52;i++)if(in[i]%2==1)sum++;
if(sum!=2 && sum)return false;
return true;
}
void dfs(int u){
ans[++cnt]=u;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(cnt==n+1)return;
if(!dis[u][v]){
dis[u][v]=1; dis[v][u]=1;
dfs(v);
dis[u][v]=0; dis[v][u]=1;
}
}
if(cnt!=n+1)cnt--;
}
int main(){
scanf("%d",&n);
make();
if(!check()){puts("No Solution"); return 0;}
for(int i=0;i<52;i++)sort(G[i].begin(),G[i].end());
int start=0;
for(int i=0;i<52;i++)
if(vis[i]){start=i; break;}
for(int i=0;i<52;i++)
if(in[i]%2==1){start=i; break;}
dfs(start);
for(int i=1;i<=cnt;i++)putchar(word[ans[i]]);
puts("");
return 0;
}