#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100+10
typedef struct word{
char* w;
struct word * l;
}Word;
Word* dic[26];
char buf[5000][200];
int insert(char* p)
{
int inx = (*p) - 'a';
if(dic[inx] == NULL)
{
dic[inx] = (Word*)malloc(sizeof(Word));
dic[inx]->w = p;
dic[inx]->l = NULL;
}
else
{
Word* q = dic[inx];
Word* pre, *tmp;
pre = NULL;
tmp = NULL;
while(q && (strcmp(q->w, p) <= 0))
{pre = q; q = q->l;}
if(pre == NULL) //should be inserted before the first elem
{
tmp = (Word*)malloc(sizeof(Word));
tmp->w = p;
tmp->l = q;
dic[inx] = tmp;
}
else if(strcmp(pre->w, p) )
{
tmp = (Word*)malloc(sizeof(Word));
tmp->w = p;
tmp->l = pre->l;
pre->l = tmp;
}
}
return 0;
}
int main()
{
// char buf[MAX];
for(int i = 0; i < 26; i++)
dic[i] = NULL;
int j = 0;
while(fgets(buf[j],MAX,stdin))
{
int dis = 'A'-'a';
int i = 0, flag = 0;;
char * p= NULL;
while(buf[j][i])
{
if(buf[j][i]>='A' && buf[j][i]<='Z')
{
if(flag == 0){
p = &(buf[j][i]);
flag = 1;
}
buf[j][i] = buf[j][i] - dis;
}
else if(buf[j][i]<'a' || buf[j][i] > 'z')
{
if(flag == 1)
{
flag =0;
buf[j][i] = '\0';
insert(p);
}
else
buf[j][i] = '\0';
}
else{
if(flag == 0) {
p = &(buf[j][i]);
flag = 1;
}
}
i++;
}
j++;
}
Word* q = NULL;
for(int i = 0; i < 26; i++)
{
q = dic[i];
while(q)
{
printf("%s\n", q->w);
q = q->l;
}
}
return 0;
}