#include <iostream>
#include <vector>
#include <set>
#include <assert.h>
using namespace std;
class Node{
public:
Node * parent;
vector<Node *> children;
string key;
Node(string const & name) : parent(NULL), key(name) {}
};
void print_recursive(Node * node, int depth = 0) {
for (int d = 0; d < depth; ++d) {
cout << " ";
}
cout << node->key << endl;
for (auto & child: node->children) {
print_recursive(child, depth + 1);
}
}
class tree{
public:
int size;
Node * root;
tree() : size(0), root(NULL) {}
Node * find_index(Node * cur, string const & key) {
if (cur == NULL) {
return NULL;
}
if (cur->key == key){
return cur;
}
for (auto const & child: cur->children) {
auto result = find_index(child, key);
if (result != NULL) {
return result;
}
}
return NULL;
}
void add() {
std::set<Node *> roots;
string father, son;
while (cin >> father >> son) {
Node * nfather = get_node(father, roots);
if (nfather->parent == NULL) {
roots.insert(nfather);
}
Node * nson = get_node(son, roots);
assert(nson->parent == NULL); // nson must not have another father
nson->parent = nfather;
nfather->children.push_back(nson);
roots.erase(nson);
}
assert(roots.size() == 1);
root = *(roots.begin());
}
// Get or create the node with key name
Node * get_node(string const & name, set<Node *> const & roots) {
Node * cur = NULL;
for (auto & root: roots) {
cur = find_index(root, name);
if (cur != NULL) break;
}
if (cur == NULL) { // create node if not found
++size;
cur = new Node(name);
}
return cur;
}
};
int main() {
tree T;
T.add();
print_recursive(T.root);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8YXNzZXJ0Lmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBOb2RlewogICAgcHVibGljOgogICAgTm9kZSAqIHBhcmVudDsKICAgIHZlY3RvcjxOb2RlICo+IGNoaWxkcmVuOwogICAgc3RyaW5nIGtleTsKICAgIE5vZGUoc3RyaW5nIGNvbnN0ICYgbmFtZSkgOiBwYXJlbnQoTlVMTCksIGtleShuYW1lKSB7fQp9OwogICAgCnZvaWQgcHJpbnRfcmVjdXJzaXZlKE5vZGUgKiBub2RlLCBpbnQgZGVwdGggPSAwKSB7Cglmb3IgKGludCBkID0gMDsgZCA8IGRlcHRoOyArK2QpIHsKCQljb3V0IDw8ICIgICAiOwoJfQoJY291dCA8PCBub2RlLT5rZXkgPDwgZW5kbDsKCQoJZm9yIChhdXRvICYgY2hpbGQ6IG5vZGUtPmNoaWxkcmVuKSB7CgkJcHJpbnRfcmVjdXJzaXZlKGNoaWxkLCBkZXB0aCArIDEpOwoJfQp9CgogICAgCmNsYXNzIHRyZWV7CiAgICBwdWJsaWM6CiAgICBpbnQgc2l6ZTsKICAgIE5vZGUgKiByb290OwogICAgdHJlZSgpIDogc2l6ZSgwKSwgcm9vdChOVUxMKSB7fQoKICAgIE5vZGUgKiBmaW5kX2luZGV4KE5vZGUgKiBjdXIsIHN0cmluZyBjb25zdCAmIGtleSkgewogICAgICAgIGlmIChjdXIgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgaWYgKGN1ci0+a2V5ID09IGtleSl7CiAgICAgICAgICAgIHJldHVybiBjdXI7CiAgICAgICAgfQogICAgICAgIGZvciAoYXV0byBjb25zdCAmIGNoaWxkOiBjdXItPmNoaWxkcmVuKSB7CiAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gZmluZF9pbmRleChjaGlsZCwga2V5KTsKICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHZvaWQgIGFkZCgpIHsgCiAgICAJc3RkOjpzZXQ8Tm9kZSAqPiByb290czsKICAgICAgICBzdHJpbmcgZmF0aGVyLCBzb247CiAgICAgICAgd2hpbGUgKGNpbiA+PiBmYXRoZXIgPj4gc29uKSB7CiAgICAgICAgCQogICAgICAgIAlOb2RlICogbmZhdGhlciA9IGdldF9ub2RlKGZhdGhlciwgcm9vdHMpOwogICAgICAgIAlpZiAobmZhdGhlci0+cGFyZW50ID09IE5VTEwpIHsKICAgICAgICAJCXJvb3RzLmluc2VydChuZmF0aGVyKTsKICAgICAgICAJfQogICAgICAgIAkKICAgICAgICAgICAgTm9kZSAqIG5zb24gPSBnZXRfbm9kZShzb24sIHJvb3RzKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGFzc2VydChuc29uLT5wYXJlbnQgPT0gTlVMTCk7IC8vIG5zb24gbXVzdCBub3QgaGF2ZSBhbm90aGVyIGZhdGhlcgogICAgICAgICAgICBuc29uLT5wYXJlbnQgPSBuZmF0aGVyOwogICAgICAgICAgICBuZmF0aGVyLT5jaGlsZHJlbi5wdXNoX2JhY2sobnNvbik7CiAgICAgICAgICAgIHJvb3RzLmVyYXNlKG5zb24pOwogICAgICAgIH0KICAgICAgICBhc3NlcnQocm9vdHMuc2l6ZSgpID09IDEpOwogICAgICAgIHJvb3QgPSAqKHJvb3RzLmJlZ2luKCkpOwogICAgfQogICAgCiAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBub2RlIHdpdGgga2V5IG5hbWUKICAgIE5vZGUgKiBnZXRfbm9kZShzdHJpbmcgY29uc3QgJiBuYW1lLCBzZXQ8Tm9kZSAqPiBjb25zdCAmIHJvb3RzKSB7CiAgICAJTm9kZSAqIGN1ciA9IE5VTEw7CiAgICAgICAgZm9yIChhdXRvICYgcm9vdDogcm9vdHMpIHsKICAgICAgICAJY3VyID0gZmluZF9pbmRleChyb290LCBuYW1lKTsKICAgICAgICAJaWYgKGN1ciAhPSBOVUxMKSBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7IC8vIGNyZWF0ZSBub2RlIGlmIG5vdCBmb3VuZAogICAgICAgICAgICArK3NpemU7CiAgICAgICAgCWN1ciA9IG5ldyBOb2RlKG5hbWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY3VyOwogICAgfQp9OyAKCmludCBtYWluKCkgewoJdHJlZSBUOwoJVC5hZGQoKTsKCXByaW50X3JlY3Vyc2l2ZShULnJvb3QpOwp9