#include #include #include using namespace std; int main () { int N; cin >> N; vector> graph(N); for (int i = 0; i < N; i++) { for (int j = 0; j < 4; j++) { string str; cin >> str; int to; try { to = stoi(str) - 1; } catch (...) { continue; } graph[i].push_back(to); } } // それぞれのノードで名前を構築するとしんどいので、dfs巡回順だけ見て、各自の受け持ち分だけ構築する。 vector prefix(N), suffix(N); { auto dfs = [&] (auto self, int pos, int par) -> void { bool has = false; for (auto nex: graph[pos]) { if (nex == par) continue; self(self, nex, pos); } if (par != -1) { prefix[pos] = "("; suffix[pos] = "methyl)"; } else { suffix[pos] = "methan"; } }; dfs(dfs, 0, -1); } string ans = ""; { auto dfs = [&] (auto self, int pos, int par) -> void { ans += prefix[pos]; for (auto nex: graph[pos]) { if (nex == par) continue; self(self, nex, pos); } ans += suffix[pos]; }; dfs(dfs, 0, -1); } cout << ans << "\n"; }