
#include <algorithm>
#include <iostream>
#include <set>
#include <stack>
#include <string>
#include <vector>

using namespace std;

using vertex_id = size_t;

int
main()
{
	vector<set<vertex_id>> vertices;

	for (;;) {
		vertex_id a, b;
		cin >> a;
		if (!a)
			break;
		cin >> b;
		a--;
		b--;

		if (vertices.size() <= std::max(a, b))
			vertices.resize(std::max(a, b) + 1);

		vertices[a].insert(b);
		vertices[b].insert(a);
	}

	vector<bool> expanded(vertices.size(), false);
	vector<string> smiles(vertices.size());
	stack<pair<vertex_id, bool>> s;
	vector<set<vertex_id>> children(vertices.size()),
	  back_children(vertices.size());
	vector<int> back_refs(vertices.size());
	int next_back_refs = 1;

	s.emplace(0, false);
	expanded[0] = true;

	while (!s.empty()) {
		auto &p = s.top();
		vertex_id curr = p.first;
		if (!p.second) { // first visit
			p.second = true;
			cout << "otvirame " << curr << endl;
			for (vertex_id neighbor : vertices[curr]) {
				if (!expanded[neighbor]) {
					children[curr].insert(neighbor);
					s.emplace(neighbor, false);
					expanded[neighbor] = true;
				} else {
					if (!children[neighbor].count(curr)) {
						back_children[curr].insert(
						  neighbor);
						if (!back_refs[neighbor])
							back_refs[neighbor] =
							  next_back_refs++;
					}
				}
			}
		} else {
			cout << "zavirame " << curr << endl;

			string &res = smiles[curr];

			res = "O";
			if (back_refs[curr]) {
				res += to_string(back_refs[curr]);
			}

			for (auto i : back_children[curr]) {
				res += "(" + std::to_string(back_refs[i]) + ")";
			}

			for (auto i = children[curr].begin();
			     i != children[curr].end();
			     i++) {
				auto j = i;
				++j;
				if (children[curr].end() != j)
					res += "(" + smiles[*i] + ")";
				else
					res += smiles[*i];
			}

			s.pop();
		}
	}

	cout << smiles[0] << endl;

#if 0
	for (size_t i = 0; i < vertices.size(); i++)
	{
		for (auto j:vertices[i])
		{
			cout << i << ' ' << j << endl;
		}
	}
#endif
}
