/*
TASK:gen
LANG:C++
*/

#include <cstdio>
#include <cstring>

const int MAXN = 1 << 7;
const int MAXT = 1 << 7;
const int ALPHA = 1 << 5;

int N;
char _s[MAXN];
int s[MAXN];
int tr2[ALPHA][MAXT][2];
int tr2c[ALPHA];
int tr1[MAXT][2];
int tr1c;

bool opt[MAXN][MAXN][ALPHA];

int main () {
	gets (_s);
	N = strlen (_s);
	for (int i = 0; i < N; ++i)
		s[i] = _s[i] - 'a';

	scanf ("%d\n", &tr1c);
	int i, j;
	char buf[10];
	for (i = 0; i < tr1c; ++i) {
		scanf ("%s\n", buf);
		tr1[i][0] = buf[0] - 'A';
		tr1[i][1] = buf[1] - 'a';
	}
	int tr2call;
	scanf ("%d\n", &tr2call);
	for (i = 0; i < tr2call; ++i) {
		scanf ("%s\n", buf);
		tr2[buf[0] - 'A'][tr2c[buf[0] - 'A']][0] = buf[1] - 'A';
		tr2[buf[0] - 'A'][tr2c[buf[0] - 'A']][1] = buf[2] - 'A';
		++tr2c[buf[0] - 'A'];
	}
/*
	for (i = 0; i < tr1c; ++i)
		printf ("%d - %d\n", tr1[i][0], tr1[i][1]);

	for (i = 0; i < 26; ++i) {
		if (tr2c[i]) printf ("%d -", i);
		for (j = 0; j < tr2c[i]; ++j)
			printf (" (%d %d)", tr2[i][j][0], tr2[i][j][1]);
		if (tr2c[i]) printf ("\n");
	}
*/
	for (i = 0; i < N; ++i)
		for (j = 0; j < tr1c; ++j)
			if (tr1[j][1] == s[i]) {
//				printf ("opt[%d][%d][%d] == 1\n", i,i+1,tr1[j][0]);
				opt[i][i+1][tr1[j][0]] = 1;
			}

	int m, diff, k;
	for (diff = 2; diff <= N; ++diff)
		for (i = 0; i + diff <= N; ++i)
			for (m = i + 1; m < i + diff; ++m) {
//				printf ("%d %d %d\n", i, m, i + diff);
				for (j = 0; j < 26; ++j) {
					for (k = 0; k < tr2c[j]; ++k) {
//						printf ("try %d %d(%d)\n", tr2[j][k][0], tr2[j][k][1], j);
						if (opt[i][m][tr2[j][k][0]] && opt[m][i+diff][tr2[j][k][1]]) break;
					}
					if (k != tr2c[j]) {
//						printf ("yes!\n");
						opt[i][i+diff][j] = 1;
					}
				}
			}

	int f = 0;

	for (i = 0; i < 26; ++i) if (opt[0][N][i]) {putchar (i + 'A'); f = 1;}
	if (!f) printf ("0");

	printf ("\n");
	return 0;
}
