#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<queue>
#define in cin
#define out cout
#define abs(x) ((x>0)?(x):(-(x)))
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)
#define FOR(i, a, b) for(int i = a; i <= b; ++i)
#define DOWNFOR(i, a, b) for(int i = a; i >= b; --i)
#define FOREACH(i, t) for (typeof(t.begin()) i = t.begin(); i != t.end(); ++i)
#define ll long long
using namespace std;
const int Nmax = 200;
int N,M,T;
string S[2][Nmax];
int Part[Nmax];
int cine(string p){
    for(int i=1;i<=M;i++) if(p==S[0][i] || p==S[1][i]) return i;
    return 0;
}
struct coada{
    int v[Nmax];
    int st,dr;
    int state;
    coada(){
        st=1;
        dr=0;
        state=0;
    }
    void push(int k){
        if(state) v[++dr]=k;
    }
    void close(){
        for(int i=dr;i>=st;i--) Part[v[i]]=-1;
        dr=0;
        st=1;
        state=!state;
    }
    void serve(){
        if(st<=dr){
            Part[v[st]]=-1;
            st++;
        }
    }
    void print(){
        if(st<=dr) for(int i=dr;i>=st;i--) out<<S[0][v[i]]<<' '<<S[1][v[i]]<<' ';
        else out<<-1;
        out<<'\n';
    }
} A[Nmax];
int main(){
    in>>N>>M;
    for(int i=1;i<=M;i++){
        in>>S[0][i]>>S[1][i];
        Part[i]=-1;
    }
    in>>T;
    for(int i=1;i<=T;i++){
        int t,x;
        string q;
        in>>t;
        if(t==1){
            in>>x;
            A[x].close();
        }
        if(t==2){
            in>>x>>q;
            int k=cine(q);
            if(k==0) while(1);
            Part[k]=x;
            A[x].push(k);
        }
        if(t==3){
            in>>x;
            A[x].serve();
        }
        if(t==4){
            in>>x;
            A[x].print();
        }
        if(t==5){
            in>>q;
            out<<Part[cine(q)]<<'\n';
        }
    }
    return 0;
}