#include <iostream>
#include <unordered_set>
#include <unordered_map>
#include <vector>
using namespace std;
struct Node {
int val;
unordered_map<Node*, int> edges;
Node(int val): val(val) {}
void addEdge(Node* node, int weight = 1) {
edges[node] = weight;
}
};
void dfs_helper(Node* node, unordered_set<Node*> &visiting, unordered_set<Node*> &visited){
if(!node || visiting.find(node)!=visiting.end()) return;
if(visited.find(node)!=visited.end()){
cout<<"Not exploring again: "<<node->val<<endl;
return;
}
visited.insert(node);
visiting.insert(node);
cout<<"Visiting: "<<node->val<<endl;
for(auto p: node->edges){
dfs_helper(p.first, visiting, visited);
}
cout<<"Leaving: "<<node->val<<endl;
visiting.erase(node);
}
void dfs(Node* root){
unordered_set<Node*> visiting;
unordered_set<Node*> visited;
dfs_helper(root, visiting, visited);
return;
}
unordered_map<int, Node*> generate_graph(vector<pair<int,int>> &edges){
unordered_map<int, Node*> graph;
int i,j;
for(auto p: edges){
i = p.first;
j = p.second;
if(graph.find(i)==graph.end()) graph[i] = new Node(i);
if(graph.find(j)==graph.end()) graph[j] = new Node(j);
graph[i]->addEdge(graph[j]);
graph[j]->addEdge(graph[i]);
}
return graph;
}
int main() {
int t;
int a, b;
cin>>t;
vector<pair<int,int>> v;
while(t--){
cin>>a>>b;
v.push_back({a,b});
}
unordered_map<int, Node*> graph = generate_graph(v);
dfs(graph.begin()->second);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTm9kZSB7CglpbnQgdmFsOwoJdW5vcmRlcmVkX21hcDxOb2RlKiwgaW50PiBlZGdlczsKCU5vZGUoaW50IHZhbCk6IHZhbCh2YWwpIHt9Cgl2b2lkIGFkZEVkZ2UoTm9kZSogbm9kZSwgaW50IHdlaWdodCA9IDEpIHsKCQllZGdlc1tub2RlXSA9IHdlaWdodDsKCX0KfTsKCnZvaWQgZGZzX2hlbHBlcihOb2RlKiBub2RlLCB1bm9yZGVyZWRfc2V0PE5vZGUqPiAmdmlzaXRpbmcsIHVub3JkZXJlZF9zZXQ8Tm9kZSo+ICZ2aXNpdGVkKXsKCWlmKCFub2RlIHx8IHZpc2l0aW5nLmZpbmQobm9kZSkhPXZpc2l0aW5nLmVuZCgpKQlyZXR1cm47CglpZih2aXNpdGVkLmZpbmQobm9kZSkhPXZpc2l0ZWQuZW5kKCkpewoJCWNvdXQ8PCJOb3QgZXhwbG9yaW5nIGFnYWluOiAiPDxub2RlLT52YWw8PGVuZGw7CgkJcmV0dXJuOwoJfQoJdmlzaXRlZC5pbnNlcnQobm9kZSk7Cgl2aXNpdGluZy5pbnNlcnQobm9kZSk7Cgljb3V0PDwiVmlzaXRpbmc6ICI8PG5vZGUtPnZhbDw8ZW5kbDsKCWZvcihhdXRvIHA6IG5vZGUtPmVkZ2VzKXsKCQlkZnNfaGVscGVyKHAuZmlyc3QsIHZpc2l0aW5nLCB2aXNpdGVkKTsKCX0KCWNvdXQ8PCJMZWF2aW5nOiAiPDxub2RlLT52YWw8PGVuZGw7Cgl2aXNpdGluZy5lcmFzZShub2RlKTsKfQoKdm9pZCBkZnMoTm9kZSogcm9vdCl7Cgl1bm9yZGVyZWRfc2V0PE5vZGUqPiB2aXNpdGluZzsKCXVub3JkZXJlZF9zZXQ8Tm9kZSo+IHZpc2l0ZWQ7CglkZnNfaGVscGVyKHJvb3QsIHZpc2l0aW5nLCB2aXNpdGVkKTsKCXJldHVybjsKfQoKdW5vcmRlcmVkX21hcDxpbnQsIE5vZGUqPiBnZW5lcmF0ZV9ncmFwaCh2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gJmVkZ2VzKXsKCXVub3JkZXJlZF9tYXA8aW50LCBOb2RlKj4gZ3JhcGg7CglpbnQgaSxqOwoJZm9yKGF1dG8gcDogZWRnZXMpewoJCWkgPSBwLmZpcnN0OwoJCWogPSBwLnNlY29uZDsKCQlpZihncmFwaC5maW5kKGkpPT1ncmFwaC5lbmQoKSkJZ3JhcGhbaV0gPSBuZXcgTm9kZShpKTsKCQlpZihncmFwaC5maW5kKGopPT1ncmFwaC5lbmQoKSkJZ3JhcGhbal0gPSBuZXcgTm9kZShqKTsKCQlncmFwaFtpXS0+YWRkRWRnZShncmFwaFtqXSk7CgkJZ3JhcGhbal0tPmFkZEVkZ2UoZ3JhcGhbaV0pOwoJfQoJcmV0dXJuIGdyYXBoOwp9CmludCBtYWluKCkgewoJaW50IHQ7CglpbnQgYSwgYjsKCWNpbj4+dDsKCXZlY3RvcjxwYWlyPGludCxpbnQ+PiB2OwoJd2hpbGUodC0tKXsKCQljaW4+PmE+PmI7CgkJdi5wdXNoX2JhY2soe2EsYn0pOwoJfQoJdW5vcmRlcmVkX21hcDxpbnQsIE5vZGUqPiBncmFwaCA9IGdlbmVyYXRlX2dyYXBoKHYpOwoJZGZzKGdyYXBoLmJlZ2luKCktPnNlY29uZCk7CglyZXR1cm4gMDsKfQ==
MzAKMCA0CjAgNQowIDEwCjAgMTMKMSAxNgoyIDMKMiAxNAoyIDE3CjMgNQozIDEyCjMgMTcKMyAxOAo0IDcKNSA2CjUgMTAKNSAxMQo1IDE0CjUgMTUKNiA4CjcgMTkKOSAxNwoxMCAxNgoxMCAxNwoxMCAxOAoxMSAxNAoxMSAxOQoxMyAxNgoxNCAxNQoxNSAxNgoxNSAxOAo=
30
0 4
0 5
0 10
0 13
1 16
2 3
2 14
2 17
3 5
3 12
3 17
3 18
4 7
5 6
5 10
5 11
5 14
5 15
6 8
7 19
9 17
10 16
10 17
10 18
11 14
11 19
13 16
14 15
15 16
15 18