{
TASK:gen
LANG:PASCAL
}

type el = record
           ch1, ch2 : char;
          end;



var t1 : array['a'..'z', '@'..'Z'] of byte;
    t2 : array['A'..'Z', 'A'..'Z', '@'..'Z'] of byte;
    a : array[0..100, 0..100, '@'..'Z'] of byte;
    b : array['A'..'Z', 0..100] of el;
    c : array['A'..'Z'] of longint;
    sim : array['A'..'Z'] of longint;
    sim_stack : array[0..100] of char;
    vr, fl, len, n1, n2, i, j, k, l, o, p, m, n, vr2 : longint;
    s, s1, s2 : string;
    ch, ch1, ch2 : char;


procedure input;
var f : text;
    ch, ch1, ch2, ch3 : char;
 begin
  assign(f, '');
  reset(f);
  readln(f, s);
  readln(f, n1);
  for i := 1 to n1 do
    begin
     readln(f, ch1, ch2);
     t1[ch2, ch1] := 1;
     sim[ch1] := 1;
    end;
  readln(f, n2);
  for i := 1 to n2 do
    begin
     readln(f, ch, ch1, ch2);
     t2[ch1, ch2, ch] := 1;
     inc(c[ch]);
     b[ch, c[ch]].ch1 := ch1;
     b[ch, c[ch]].ch2 := ch2;
     sim[ch] := 1;
    end;
  close(f);
  for ch := 'A' to 'Z' do
    if sim[ch] = 1 then
      begin
       inc(vr2);
       sim_stack[vr2] := ch;
      end;
 end;


begin
 input;

 n := length(s);
 for i := 1 to n do
   begin
    for ch := 'A' to 'Z' do
      if t1[s[i], ch] = 1 then a[i, i, ch] := 1;
   end;
 for len := 2 to n do
   begin
    for i := 1 to n - len + 1 do
      begin
       j := i + len - 1;
       for l := i to j - 1 do
         begin
          for p := 1 to vr2 do
            begin
             ch := sim_stack[p];
             if a[i, j, ch] = 0 then
               begin
                vr := c[ch];
                for o := 1 to vr do
                  begin
                   ch1 := b[ch, o].ch1;
                   ch2 := b[ch, o].ch2;
                   if (a[i, l, ch1] = 1) and (a[l + 1, j, ch2] = 1) then a[i, j, ch] := 1;
                  end;
               end;
            end;
         end;
      end;
   end;
 for ch := 'A' to 'Z' do
   if a[1, n, ch] = 1 then
     begin
      fl := 1;
      write(ch);
     end;
 if fl = 1 then writeln
 else writeln(0);
end.

