#include <stdio.h>
#include <string.h>


int n, m;

int p[1005], u[1005];
int q[205][2000];
int nr[200], v[200], viz[200];
char s[200][200];

int find (char st[])
{
	int i, j, k, lim = strlen (st + 1);
	
	for (i = 1; i <= m; i ++)
	{
		for (j = 1; j <= nr[i]; j ++)
		{
			for (k = 1; k <= lim; k ++)
				if (s[i][j + k - 1] != st[k])
					break;
			if (k == lim + 1)
				return i;
		}
	}
	return 0;
}

int main ()
{
#ifndef ONLINE_JUDGE
	freopen ("ticket.in", "r", stdin);
	freopen ("ticket.out", "w", stdout);
#endif

	scanf ("%d %d\n", &n, &m);
	
	int i, j, t, x, tip;
	
	for (i = 1; i <= m; i ++)
	{
		gets (s[i] + 1);
		nr[i] = strlen (s[i] + 1);
	}
	scanf ("%d", &t);
	for (i = 1; i <= m; i ++)
		v[i] = -1;
	for (i = 1; i <= n; i ++)
		p[i] = 1;
	v[0] = -1;
	char str[200];
	while (t --)
	{
		scanf ("%d ", &tip);
		memset (str, 0, sizeof (str));
		if (tip == 1)
		{
			scanf ("%d", &x);
			viz[x] = !viz[x];
			if (viz[x] == 0)
			{
				for (i = p[x]; i <= u[x]; i ++)
				{
					v[q[x][i]] = -1;
				}
				u[x] = 0;
				p[x] = 1;
			}
		}
		if (tip == 2)
		{
			scanf ("%d ", &x);
			gets (str + 1);
			if (viz[x])
			{
				u[x] ++;
				q[x][u[x]] = find (str);
				v[find (str)] = x;
			}
		}
		if (tip == 3)
		{
			scanf ("%d", &x);
			if (p[x] <= u[x])
			{
				v[q[x][p[x]]] = -1;
				p[x] ++;
			}
		}
		if (tip == 4)
		{
			scanf ("%d", &x);
			if (p[x] > u[x])
				printf ("-1\n");
			else
			{
				for (i = u[x]; i >= p[x]; i --)
				{
					for (j = 1; j <= nr[q[x][i]]; j ++)
						printf ("%c", s[q[x][i]][j]);
					printf (" ");
				}
				printf ("\n");
			}
		}
		if (tip == 5)
		{
			memset (str, 0, sizeof (str));
			gets (str + 1);
			printf ("%d\n", v[find (str)]);
		}
	}
	return 0;
}