#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <stack>
#define M 50100
using namespace std;
typedef struct Node{
struct Node *next[27];
int mark;
}Node;
Node vec[1000];
Node *root;
char str[M][100];
char print[M][100];
int cnt_print;
int cnt;
int cc;
int I;
int cmp(const void *a,const void *b)
{
return strcmp((char *)a,(char *)b);
}
void Initial()
{
int i,j;
for(i = 0;i < M;i++){
for(j = 0;j < 27;j++)
vec[i].next[j] = NULL;
vec[i].mark = 0;
}
cnt = cc = 0;
cnt_print = 0;
}
int Bsearch(char *s)
{
int x,y,m;
x = 0, y = cnt;
while(x < y){
m = x + (y-x)/2;
if(strcmp(str[m],s) == 0)
return 1;
else if(strcmp(str[m],s) > 0)
y = m;
else
x = m+1;
}
return 0;
}
void dfs(Node *r,char *s,int cur)
{
int flage = 0;
if(r->mark == 2) flage = 1;
for(int i = 1;i <= 26;i++){
if(r->next[i] == NULL)
continue;
else{
s[cur] = i + 'a' - 1;
dfs(r->next[i],s,cur+1);
}
}
if(flage){
s[cur] = 0;
if(r->mark != 1)
if(Bsearch(s)){
r->mark = 1;
strcpy(print[cnt_print],str[I]);
strcat(print[cnt_print],s);
cnt_print++;
}
}
}
void trie_built(char *s)
{
Node *r = root;
int t,len,flage;
len = strlen(s);
for(int i = 0;i < len;i++){
t = s[i] - 'a' + 1;
if(r->next[t] == NULL)
r->next[t] = &vec[cc++];
r = r->next[t];
if(i == len - 1) r->mark = 2; //单词结束标志 ,开始时未添加 wa N久
}
void Find(char *s)
{
Node *r = root;
int t,len;
char q[100];
len = strlen(s);
for(int i = 0;i < len;i++){
t = s[i] - 'a' + 1;
r = r->next[t];
}
for(int i = 1;i <= 26;i++){
if(r->next[i] != NULL){
q[0] = i + 'a' - 1;
dfs(r->next[i],q,1);
}
}
return;
}
int main()
{
//freopen("in.in","r",stdin);
Initial();
root = &vec[cc++];
while(cin>>str[cnt])
{
trie_built(str[cnt]);
cnt++;
}
for(I = 0;I < cnt;I++)
Find(str[I]);
qsort(print,cnt_print,sizeof(print[0]),cmp);
for(int i = 0;i < cnt_print;i++)
cout<<print[i]<<endl;
return 0;
}