#include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

vector<int> ch[301];
map<string,int> mp;
vector<int> G[301];
int siz=0;
int type[301];
int dp[301][301];
set<int> se[301];
int cnt[301],all[301];
bool flag[301][301];


typedef string::const_iterator State;
int expression(State &begin);

string tostring(int v){
	if(v==0)return "0";
	string s;
	while(v>0){
		s+=((v%10)+'0');
		v/=10;
	}
	reverse(s.begin(),s.end());
	return s;
}

int expression(State &begin){
	int cur=siz;
	if(*begin=='('){
		begin++;
		siz++;
		int ret=expression(begin);
		begin++;
		siz++;
		int ret2=expression(begin);
		G[cur].push_back(ret);
		G[cur].push_back(ret2);
		begin++;
		return cur;
	}else if(*begin=='x'){
		begin++;
		return siz;
	}else{
		assert(false);
	}
}

int check(int v1,int v2){
	if(v1==v2)return 0;
	if(v1==0)return -1;
	if(v2==0)return 1;
	if(cnt[v1]*all[v2]!=cnt[v2]*all[v1]){
		if(cnt[v1]*all[v2]<cnt[v2]*all[v1])return -1;
		return 1;
	}
	
	//printf("ch %d %d %d %d\n",v1,v2,ch[v1][0],ch[v2][0]);
	if(flag[v1][v2])return dp[v1][v2];
	flag[v1][v2]=true;
	int res=check(ch[v1][0],ch[v2][0]);
	//printf("ch %d %d %d %d %d\n",v1,v2,ch[v1][0],ch[v2][0],res);
	if(res==-1){
		dp[v1][v2]=-1;
		return res;
	}else if(res==1){
		dp[v1][v2]=1;
		return res;
	}
	res=check(ch[v1][1],ch[v2][1]);
	//printf("ch %d %d %d %d %d\n",v1,v2,ch[v1][1],ch[v2][1],res);
	dp[v1][v2]=res;
	return res;
}

int dfs(int v){
	if(G[v].size()==0){
		type[v]=mp["0"];
	}else{
		int v1=dfs(G[v][0]);
		int v2=dfs(G[v][1]);
		if(v1>v2)swap(v1,v2);
		string vs="("+tostring(v1)+","+tostring(v2)+")";
		if(mp.find(vs)==mp.end()){
			int id=mp.size();
			mp[vs]=id;
			ch[id].push_back(v1);
			ch[id].push_back(v2);
			if(check(ch[id][0],ch[id][1])==1){
				swap(ch[id][0],ch[id][1]);
			}
			se[id].insert(id);
			for(set<int>::iterator it=se[v1].begin();it!=se[v1].end();it++){
				se[id].insert(*it);
			}
			for(set<int>::iterator it=se[v2].begin();it!=se[v2].end();it++){
				se[id].insert(*it);
			}
			all[id]=se[id].size()-1;
			set<int> tmp;
			for(set<int>::iterator it=se[v1].begin();it!=se[v1].end();it++){
				tmp.insert(*it);
			}
			cnt[id]=0;
			for(set<int>::iterator it=se[v2].begin();it!=se[v2].end();it++){
				if(tmp.find(*it)!=tmp.end()){
					cnt[id]++;
				}
			}
		}
		type[v]=mp[vs];
	}
	return type[v];
}

void construct(int v){
	if(G[v].size()==2){
		construct(G[v][0]);
		construct(G[v][1]);
		int rec=check(type[G[v][0]],type[G[v][1]]);
		if(rec==1){
			swap(G[v][0],G[v][1]);
		}
	}
}

string get(int v,int f){
	if(G[v].size()==0){
		return "x";
	}
	if(f==-1){
		return "(" + get(G[v][0],-1) + " " +get(G[v][1],1) +")";
	}else{
		return "(" + get(G[v][1],-1) + " " +get(G[v][0],1) +")";
	}
}


int main(void){
	while(1){
		string str;
		getline(cin,str);
		if(str=="0")break;
		for(int i=0;i<300;i++){
			ch[i].clear();
			G[i].clear();
			se[i].clear();
		}
		memset(dp,0,sizeof(dp));
		memset(flag,false,sizeof(flag));
		siz=0;
		mp.clear();
		mp["0"]=0;
		all[0]=1;
		se[0].insert(0);
		State st=str.begin();
		expression(st);
		dfs(0);
		construct(0);
		cout << get(0,-1) << endl;
	}
	return 0;
} 
