#include <cstdio>
#include <stack>
#include <cstring>
#include <string>
#include <map>
#include <queue>

#undef MINDCODING
#define MINDCODING
#define FILEIN "ticket.in"
#define FILEOUT "ticket.out"
#define NMAX 105

using namespace std;

map<string, int> NameToID;
pair<string, string> IDToName[NMAX];
int n, m, t;

queue<int> Queues[NMAX];
int QueueID[NMAX];
bool Status[NMAX];

char c_name[25], c_surname[25];

int main() {
    #ifndef MINDCODING
    freopen(FILEIN, "r", stdin);
    freopen(FILEOUT, "w", stdout);
    #endif // MINDCODING


    scanf("%d %d", &n, &m);

    for ( int i = 1; i <= m; i++ ) {
        scanf("%s %s", &c_name, &c_surname);
        string name(c_name), surname(c_surname);

        NameToID[name] = i;
        NameToID[surname] = i;
        IDToName[i] = make_pair(name, surname);
    }

    for ( int i = 1; i <= n; i++ ) QueueID[i] = -1;

    scanf("%d", &t);

    while(t--) {
        int op;
        scanf("%d", &op);
        int x;
        char c_y[25];

        if (op == 1) {
            scanf("%d", &x);
            Status[x] = !Status[x];
            if (!Status[x]) {
                while(!Queues[x].empty())
                    QueueID[Queues[x].front()] = -1, Queues[x].pop();
            }
        }
        else
        if (op == 2) {
            scanf("%d %s", &x, &c_y);
            string y(c_y);

            if (NameToID.find(y) != NameToID.end())
                Queues[x].push(NameToID[y]), QueueID[NameToID[y]] = x;
        }
        else
        if (op == 3 ) {
            scanf("%d", &x);
            QueueID[Queues[x].front()] = -1, Queues[x].pop();
        }
        else
        if (op == 4 ){
            scanf("%d", &x);
            queue<int> tmpqueue(Queues[x]);
            stack<int> tmpstack;
            while (!tmpqueue.empty()) {
                tmpstack.push(tmpqueue.front());
                tmpqueue.pop();
            }

            if (tmpstack.size() == 0)
                printf("-1");

            char *c1, *c2;
            while (!tmpstack.empty()) {
                c1 = (char *) (IDToName[tmpstack.top()].first.c_str()),
                c2 = (char *) (IDToName[tmpstack.top()].second.c_str());

                printf("%s %s ", c1, c2);
                tmpstack.pop();
            }
            printf("\n");
        }
        else
        if (op == 5) {
            scanf("%s", &c_y);

            string y(c_y);

            if (NameToID.find(y) == NameToID.end())
                printf("-1\n");
            else {
                int q_x = QueueID[NameToID[y]];
                printf("%d\n", q_x);
            }
        }
    }

    return 0;
}