/*
TASK:gen
LANG:C++
*/
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <set>
#define debln(a) cout << #a << " : " << a << endl;
#define FOR(i,n) for(int i=0;i<n;i++)
using namespace std;
typedef pair<char,char> pcc;

string s;
bool possible[27];
vector< vector<char> > v;
vector< vector<char> > a;
int n,m;

int encode(char a,char b) {
    int ca = a-'A';
    int cb = b-'A';
    return ca + cb * 30;
}

pcc decode(int code) {
    int ca = code % 30;
    int cb = code/30;
    return make_pair( ca+'A', cb+'A' );
}

void testEncodeDecode() {
     char a,b;
     while(cin >> a >> b) {
        pcc ans = decode(encode(a,b));
        cout << ans.first << " " << ans.second << endl;
     }
}
void stop() { int x; cin >> x; }
void init() {
     cin >> s;
     cin >> n;
     char c,d;
     a.resize(27);
     v.resize(27+27*30);
     FOR(i,n) {
        cin >> c >> d;
        a[d-'a'].push_back(c);
     }
     cin >> m;
     char e;
     FOR(i,m) {
            cin >> c >> d >> e;
            v[ encode(d,e) ].push_back(c);  
     }
     #ifdef debugInit
     FOR(i,a.size()) {
       if(a[i].empty()) continue;
       cout << (char)(i+'a');
       FOR(j,a[i].size()) {
           cout << a[i][j] << " ";               
       }
       cout << endl;
     }
     FOR(i,v.size()) {
       if(v[i].empty()) continue;
       pcc cur = decode(i);
       cout << cur.first << " " << cur.second << endl;
       FOR(j,v[i].size()) {
          cout << v[i][j] << endl;
       }
       cout << endl;
     }
     #endif
}
void solve() {
     set<string> used;
     queue<string> q;
     q.push(s);
     used.insert(s);
     while(!q.empty()) {
         string f = q.front();
         //debln(f);
         q.pop();
         if(f.size()==1 && f[0]>='A' && f[0]<='Z') {
           possible[ f[0] - 'A' ] = 1;
         }
         
        // lower -> upper
        int fsz = f.size();
        FOR(i,fsz) {
           if(f[i]>='a' && f[i]<='z') {
                    if(a[f[i]-'a'].empty()) {
                      continue;
                    }
                    FOR(j,a[f[i]-'a'].size()) {
                       string ss = f;
                       ss[i] = a[f[i]-'a'][j];
                       if(used.find(ss)==used.end()) {
                         used.insert(ss);
                         q.push(ss);
                       }
                    }
           }
        }
        
        // upper upper -> upper
        string curS="";
        FOR(i,fsz-1) {
          if(f[i]>='A' && f[i]<='Z' && f[i+1]>='A' && f[i+1]<='Z') {
                       int code = encode(f[i],f[i+1]);
                       if(v[code].empty()) continue;
                       FOR(j,v[code].size()) {
                           string ns = curS + v[code][j] + f.substr(i+2,f.size());
                           if(used.find(ns)==used.end()) {
                              used.insert(ns);
                              q.push(ns);
                           }
                       }
          }
          curS += f[i];
        }
     }
     bool found = false;
     FOR(i,26) if(possible[i]) {
               found = true;
               cout << (char)(i+'A');
     }
     if(!found) cout << 0 << endl;
     else cout << endl;
}
int main() {
    init();
    solve();
//    stop();
    return 0;
}
