#include<iostream>
#include<queue>
using namespace std;
#define maxn 10005
struct node
{
string name,s;
int rp;
friend bool operator<(node a,node b)
{
if(a.rp!=b.rp) return a.rp>b.rp;//第一关键字,如果人品不相等,这样写就是说人品差的会排在队首(堆顶)
return a.name<b.name;//第二关键字,如果人品相等,那么姓名字典序大的队首(堆顶)
}
};
int main(){
int n,m;
int xi,xj,rp,num;
string name,s;
while(cin>>n>>m){
priority_queue<node>que[maxn];
node t;
for(int i=1;i<=n;i++)
{
int cnt,rp,id;
string name;
cin>>cnt;
while(cnt--)
{
cin>>name>>rp;
t.name=name;
t.rp=rp;
que[i].push(t);
}
}
for(int i = 0;i<m;++i){
cin>>s;
if(s == "GETOUT"){
cin>>xj;
t = que[xj].top();
que[xj].pop();
cout<<t.name<<endl;
}
else if(s == "JOIN"){
cin>>xi>>xj;
while(que[xj].size()){
t = que[xj].top();
que[xj].pop();
que[xi].push(t);
}
}
else{
cin>>num>>name>>rp;
t.name = name; t.rp = rp;
que[num].push(t);
}
}
}
return 0;
}
#include<queue>
using namespace std;
#define maxn 10005
struct node
{
string name,s;
int rp;
friend bool operator<(node a,node b)
{
if(a.rp!=b.rp) return a.rp>b.rp;//第一关键字,如果人品不相等,这样写就是说人品差的会排在队首(堆顶)
return a.name<b.name;//第二关键字,如果人品相等,那么姓名字典序大的队首(堆顶)
}
};
int main(){
int n,m;
int xi,xj,rp,num;
string name,s;
while(cin>>n>>m){
priority_queue<node>que[maxn];
node t;
for(int i=1;i<=n;i++)
{
int cnt,rp,id;
string name;
cin>>cnt;
while(cnt--)
{
cin>>name>>rp;
t.name=name;
t.rp=rp;
que[i].push(t);
}
}
for(int i = 0;i<m;++i){
cin>>s;
if(s == "GETOUT"){
cin>>xj;
t = que[xj].top();
que[xj].pop();
cout<<t.name<<endl;
}
else if(s == "JOIN"){
cin>>xi>>xj;
while(que[xj].size()){
t = que[xj].top();
que[xj].pop();
que[xi].push(t);
}
}
else{
cin>>num>>name>>rp;
t.name = name; t.rp = rp;
que[num].push(t);
}
}
}
return 0;
}