#include <iostream>
#include <string>
#define mx 1001
using namespace std;
struct treenode
{
char data;//结点信息
int num;//记录从根到此处,结点出现的次数
bool color;//从根到此处是否是关键字
treenode *next[26];
treenode(char c)//初始化结点
{
data=c;
num=1;
color=false;
for(int i=0;i<26;i++)
next[i]=NULL;
}
};
void Insert(treenode *root,string str)//插入单词
{
int i;
treenode *p=root;
if(p==NULL)//树为空(可以不要)
{
p=new treenode('A');
root = p;
}
for(i=0;i<str.length();i++)
{
int data=str[i]-'a';
if (p->next[data]==NULL)//不存在该结点
{
p->next[data]=new treenode(str[i]);
}
else//若存在该结点,则它的个数加1
{
p->next[data]->num++;
}
p=p->next[data];
}
p->color=true;
}
void finds(treenode *root,string str)
{
treenode *p=root;
char print[21];
int i,j=0;
if(p==NULL)//(可以不要)
return ;
for (i=0;i<str.length();i++)
{
int data=str[i]-'a';
if (p->next[data]->color==true||p->next[data]->num>1)
print[j++]=str[i];
else
{
print[j++]=str[i];
break;
}
p=p->next[data];
}
print[j]='\0';
cout<<' '<<print<<endl;
}
int main()
{
string a,str[mx];
int i=0,j;
treenode *root=new treenode('A');
while(cin>>a)
{
str[i++]=a;
Insert(root,a);
}
for (j=0;j<i;j++)
{
cout<<str[j];
finds(root,str[j]);
}
return 0;
}