{
TASK:gen
LANG:PASCAL
}
{$R-}
const
 maxn=101; {100}
 brk=150000;
var
{ t:text;}
 s1,s:string;
 i,j,k,l,n1,n2,br:longint;
 c,c1,c2:char;
 a:array ['a'..'z',0..maxn] of char;
 b:array ['A'..'Z','A'..'Z',0..maxn] of string[1];
 ac:array ['a'..'z'] of byte;
 bc:array ['A'..'Z','A'..'Z'] of byte;
 ans:array ['A'..'Z'] of boolean;

 procedure rec(s:string);
  var
   i,j:byte; c1,c2:char;
  begin
    inc(br); if br>brk then begin writeln(0); halt(0); end;
    if length(s)>1 then
    for i:=1 to length(s)-1 do
     for j:=1 to bc[s[i],s[i+1]] do
      begin
        c1:=s[i]; c2:=s[i+1];
        delete(s,i,2);
        insert(b[c1,c2,j],s,i);
        rec(s);
        delete(s,i,1);
        insert(c1+c2,s,i);
      end
    else ans[s[1]]:=true;
  end;

 procedure rec1(s1:string; pos:byte);
  var
   i:byte; c:char;
  begin
    if pos<=length(s1) then
    for i:=1 to ac[s1[pos]] do
     begin
       c:=s1[pos];
{       if (s1[pos]>='a')and(s1[pos]<='z') then}
        s1[pos]:=a[s1[pos],i];
       rec1(s1,pos+1);
       s1[pos]:=c;
     end
    else
     rec(s1);
  end;

begin
{  assign(t,'gen.in');
  reset (t);}
  readln ({t,}s);
  readln ({t,}n1);
  for i:=1 to n1 do
   begin
     readln({t,}c1,c);
     inc(ac[c]);
     a[c,ac[c]]:=c1;
   end;
  readln({t,}n2);
  for i:=1 to n2 do
   begin
     readln({t,}c,c1,c2);
     inc(bc[c1,c2]);
     b[c1,c2,bc[c1,c2]]:=c;
   end;
{  close (t);}

  rec1(s,1);
  for c:='A' to 'Z' do
   if ans[c] then
    begin
      write(c); inc(l); end;
  if l=0 then write(0);
  writeln;
end.