#include #include #include #include #include using namespace std; char value[1000000], type[1000000]; map ss; map ti; bool v[600][600]; char E[1000000]; vector vec; typedef map::iterator mit; int process(int l, int r) { int cnt = 0; bool tag = false; for(int i = r-1; i >= l; i--) { if( E[i] == ')' ) cnt++, tag = true; else if( E[i] == '(' ) cnt--; else if( !cnt && E[i] == '*' ) { int a = process(l, i); int b = process(i+1, r); if( a == -1 || b == -1 ) return -1; if( !v[b][a] ) return -1; return a; } if( cnt < 0 ) return -1; } if( cnt ) return -1; if( tag ) { if( E[r-1] != ')' ) return -1; string p = ""; int x; for(int i = l; ; i++) { if( E[i] == '(' ){ x = i; break; } p.push_back(E[i] ); } int b = process(x+1, r-1); if( b == -1 ) return -1; if( ti.find(p) == ti.end() ) return -1; int a = ti[p]; if( !v[b][a] ) return -1; return a; } string p = ""; for(int i = l; i < r; i++) p.push_back(E[i] ); if( ss.find(p) == ss.end() ) return -1; if( ti.find(ss[p]) == ti.end() ) return -1; return ti[ss[p] ]; } int main() { int T; scanf("%d", &T); while( T-- ) { ss.clear(); ti.clear(); vec.clear(); vec.push_back(""); fill(v[0], v[599]+600, false); bool flag = true; int N; scanf("%d", &N); for(int Ni = 0; Ni < N; Ni++) { scanf("%s %s", value, type); string p, q; p = string(value); q = string(type); if( ss.find(p) != ss.end() ) flag = false; ss[p] = q; } int M; scanf("%d", &M); for(int Mi = 1; Mi <= M; Mi++) { scanf("%s", type); string q = string(type); vec.push_back(q); if( ti.find(q) != ti.end() ) flag = false; if( ss.find(q) != ss.end() ) flag = false; ti[q] = Mi; int K; scanf("%d", &K); for(int Ki = 0; Ki < K; Ki++) { int b; scanf("%d", &b); v[Mi][b] = true; } v[Mi][Mi] = true; } for(mit mi = ss.begin(); mi != ss.end(); mi++) if( ti.find(mi->second ) == ti.end() ) flag = false; scanf("%s", E); int ans = process(0, strlen(E)); if( !flag ) ans = -1; if( ans == -1 ) puts("-1"); else printf("%s\n", vec[ans].c_str()); } }