#include<stdio.h>
#define Mx 500005
struct N
{
int l,w,r;
} l[Mx];
int f=-1,n=0,h=-1;
int Ir(int w, int i)
{
if (f == -1 && n >= Mx)
return -1;
int x = f;
if (x != -1)
f = l[x].r;
else
x = n++;
l[x].w = w;
if (i ==-1)
{
l[x].l = x;
l[x].r = x;
h = x;
}
else
{
int j = l[i].r;
l[x].l = i;
l[x].r = j;
l[i].r = x;
l[j].l = x;
if (i == l[h].l)
h = x;
}
return x;
}
int Dt(int i)
{
if (i<0||i>=n||h==-1)
return -1;
int p = l[i].l;
l[p].r = l[i].r;
l[l[i].r].l = p;
if (i == h)
{
if (p == i)
h = -1;
else
h = l[i].r;
}
l[i].r = f;
f = i;
return p;
}
int d[Mx];
int main(void)
{
int N, M;
scanf("%d%d", &N, &M);
d[1] = Ir(1, -1);
for (int i = 2; i <= N; ++i)
d[i] = Ir(i, d[i-1]);
for (int i=1,p,x,y,w; i <= M; ++i)
{
scanf("%d", &p);
switch (p)
{
case 1:
scanf("%d%d", &x, &y);
w = l[d[x]].w;
Dt(d[x]);
d[x] = Ir(w, l[d[y]].l);
break;
case 2:
scanf("%d%d", &x, &y);
w = l[d[x]].w;
Dt(d[x]);
d[x]=Ir(w, d[y]);
break;
case 3:
scanf("%d", &x);
Dt(d[x]);
break;
}
}
int i=h;
if (h == -1)
printf("Empty!");
else
do
printf("%d ", l[i].w),i=l[i].r;
while (i!=h);
return 0;
}