#include <iostream>
#include <vector>
#include <map>

using namespace std;

typedef map<char, int> nodes;

struct node {
  char znak;
  nodes childs;

  node(const char c) : znak(c), childs() {}
};


typedef vector<node> trie;

void insert(trie& T, const string& napis)
{
  int v = 0;
  for(string::const_iterator it = napis.begin();
      it != napis.end();
      ++it)
      if(T[v].childs.count(*it))
        v = T[v].childs.find(*it)->second;
      else {
        // Tworzymy nowy wezel
        int id = T.size();
        T.push_back(node(*it));
        // i dopisujemy go do listy
        T[v].childs.insert(pair<char, int>(*it, id));
        v = id;
      }
}

string napis;

void printTrie(const trie& T, int v)
{
  napis += T[v].znak;
  if(T[v].childs.empty()) {
    // Koniec rekursji
    cout << napis << endl;
  } else {
    for(nodes::const_iterator it = T[v].childs.begin();
        it != T[v].childs.end();
        ++it)
        printTrie(T, it->second);
  }
  // Ucinamy ostatni znak
  napis.resize(napis.length()-1);
}

int main(int argc, char* argv[])
{
  trie T;
  T.push_back(node(0));

  string napis;

  while(cin >> napis)
    insert(T, napis);

  cerr << T.size() << endl;

  printTrie(T, 0);
  
  return 0;
}


