/*
(栈)这里 有一个需要知道的 如果一个点走出了 原来的 位置 那么它最早的那个位置的 当他在回到原来位置的时候 可能还会有 块在那个下面
根据这点 我们就可以 大胆 的进行出栈入栈操作
*/
#include <string.h>
#include <iostream>
#include <cstdio>
using namespace std;
int L[30],N[30][30],num[30],t1,t2,A,B,KH[30],n;
void dec(int er){
int i,LOC=L[er];
for(i=num[LOC];i>=1;i--){ if(N[LOC][i]==er) break; int d=N[LOC][i]; num[LOC]--;N[d][++num[d]]=d; L[d]=d;}
}
void pustt(int er,int to){
int i,LOC=L[er];
int LL=0;
for(i=num[LOC];i>=1;i--){
int d=N[LOC][i];
KH[++LL]=d;
L[d]=L[to];
num[LOC]-- ;
if(N[LOC][i]==er) break;
}
LOC=L[to];
while(LL!=0){
N[LOC][++num[LOC]]= KH[LL];
LL--;
}
}
void print(){
for(int i=0;i<n;i++){
printf("%d:",i);
for(int j=1;j<=num[i];j++) printf(" %d",N[i][j]);
printf("\n");
}
}
int main()
{
int i;
scanf("%d",&n);
char str[100];
memset(num,0,sizeof(num));
memset(N,0,sizeof(N));
memset(L,0,sizeof(L));
for(i=0;i<n;i++){
L[i]=i;
N[i][++num[i]]=i;
}
while(scanf("%s",str)==1){
if(str[0]=='q')break;
if(str[0]=='m')t1=1;
else t1=2;
scanf("%d%s%d",&A,str,&B);
if(str[1]=='n')t2=1;
else t2=2;
if(A>=n||A<0||B>n||B<0||L[A]==L[B])continue;
if(t1==1&&t2==1){ dec(A);
dec(B);
N[L[B]][++num[L[B]]]=A; num[L[A]]--;
L[A]=L[B];
}
if(t1==1&&t2==2){ dec(A); N[L[B]][++num[L[B]]]=A; num[L[A]]--; L[A]=L[B]; }
if(t1==2&&t2==1){ dec(B);pustt(A,B); }
if(t1==2&&t2==2){ pustt(A,B); }
}
print();
return 0;
}