#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<vector> usingnamespacestd; #define ll long long #define il inline structnode{ int son[26],isword,marked; }tree[25000*25+10]; int root,tot; int n; char s[25010][25]; int max_id=0,max_num=0; vector<char> ans; bool over=false; intcreate(){ ++tot; memset(tree[tot].son,-1,sizeof(tree[tot].son)); tree[tot].isword=tree[tot].marked=0; return tot; } voidadd(int x){ int cur=root,len=strlen(s[x]); int i; for (i=0;i<len;++i){ if (tree[cur].son[s[x][i]-'a']==-1){ tree[cur].son[s[x][i]-'a']=create(); } cur=tree[cur].son[s[x][i]-'a']; } tree[cur].isword=1; } voidmark_longest(){ int cur=root; for (int i=0;i<max_num;++i){ cur=tree[cur].son[s[max_id][i]-'a']; tree[cur].marked=1; } } voiddfs(int x){ if (tree[x].isword){ ans.push_back('P'); } int ismark=-1; for (int i=0;i<26;++i){ if (tree[x].son[i]==-1) continue; int cur=tree[x].son[i]; if (!tree[cur].marked){ ans.push_back('a'+i); dfs(cur); }else{ ismark=i; } } if (ismark!=-1){ ans.push_back('a'+ismark); dfs(tree[x].son[ismark]); } if (ismark==-1&&tree[x].marked) over=true; if (!over) ans.push_back('-'); } intmain(){ scanf("%d",&n); root=create(); for (int i=1;i<=n;++i){ scanf("%s",s[i]); add(i); if (strlen(s[i])>max_num){ max_num=strlen(s[i]); max_id=i; } } mark_longest(); dfs(root); printf("%d\n",ans.size()); for (int i=0;i<ans.size();++i){ printf("%c\n",ans[i]); } return0; }