#include<bits/stdc++.h>
using namespace std;
int n;
string s;
struct node
{
int son[27];
int deep;
int fa;
int tap;
char x;
}trie[500009];
int cnt;
int all;
int flag;
int king[500009];
int maxn=-1;
int maxs;
void insert(string s)
{
int u=0;
int len=s.size();
for(int i=0;i<len;i++)
{
int c;
c=s[i]-'a';
if(!trie[u].son[c])
{
trie[u].son[c]=++cnt;
all++;
int t;
t=trie[u].son[c];
trie[t].deep=trie[u].deep+1;
trie[t].fa=u;
}
u=trie[u].son[c];
}
king[u]=1;
if(maxn<trie[u].deep)
{
maxn=trie[u].deep;
maxs=u;
}
}
int ans;
void dfs(int u)
{
if(king[u])
{
ans++;
return;
}
for(int i=0;i<26;i++)
{
if(!trie[u].son[i]) continue;
ans++;
dfs(trie[u].son[i]);
ans++;
}
}
void tap()
{
int now;
now=maxs;
while(now)
{
trie[now].tap=1;
now=trie[now].fa;
}
}
void find(int u)
{
for(int i=0;i<26;i++)
{
int v;
v=trie[u].son[i];
if(v&&trie[v].tap)
{
trie[u].son[26]=v;
trie[u].son[i]=0;
trie[u].x=(char)(i+'a');
find(v);
break;
}
}
}
void dfsprint(int u)
{
if(king[u])
{
cout<<'P'<<endl;
return;
}
for(int i=0;i<=26;i++)
{
if(!trie[u].son[i]) continue;
char x;
if(i==26) cout<<trie[u].x<<endl;
else
{
x=i+'a';
cout<<x<<endl;
}
flag++;
dfsprint(trie[u].son[i]);
if(flag==all)
{return;}
cout<<'-'<<endl;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s;
insert(s);
}
dfs(0);
flag=0;
cout<<ans-maxn<<endl;
tap();
find(0);
dfsprint(0);
return 0;
}