#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=1010;
int q,r,u,m;
map<string,int> qxmingdan;
map<string,vector<string> > usetojs;
map<string,vector<string> > jstoqx;
string qx;
struct js{
string name;
int counts;
string qx[11];
}juese;
struct user{
string name;
int counts;
string jsname[11];
}use;
string usename,quanxian;
int main(){
int i,j;
cin>>q;
for(i=0;i<q;++i){
cin>>qx;
int len=qx.length();
if(len<2){
qxmingdan[qx]=10;
}else{
if(qx[len-2]==':'){
qxmingdan[qx.substr(0,len-2)]=(qx[len-1]-'0');
}else{
qxmingdan[qx]=10;
}
}
}
cin>>r;
for(i=0;i<r;++i){
cin>>juese.name>>juese.counts;
for(j=0;j<juese.counts;++j){
cin>>juese.qx[j];
jstoqx[juese.name].push_back(juese.qx[j]);
}
}
cin>>u;
for(i=0;i<u;++i){
cin>>use.name>>use.counts;
for(j=0;j<use.counts;++j){
cin>>use.jsname[j];
usetojs[use.name].push_back(use.jsname[j]);
}
}
cin>>m;
for(i=0;i<m;++i){
cin>>usename>>quanxian;
if(usetojs.count(usename)==0){
puts("false");
continue;
}
int len=quanxian.length();
if(len<2){
if(qxmingdan.count(quanxian)==0){
puts("false");
continue;
}
}else{
if(quanxian[len-2]==':'){
if(qxmingdan.count(quanxian.substr(0,len-2))==0){
puts("false");
continue;
}
}else{
if(qxmingdan.count(quanxian)==0){
puts("false");
continue;
}
}
}
bool flag=false;
int shu=0;
int max=-1;
vector<string> vec=usetojs[usename];
for(j=0;j<vec.size();++j){
vector<string> vec2=jstoqx[vec[j]];
for(int k=0;k<vec2.size();++k){
int l=vec2[k].length();
if((len<2)||(quanxian[len-2]!=':')){
int id=qxmingdan[quanxian];
if(id==10){
string a=vec2[k];
if(a==quanxian){
flag=true;
puts("true");
break;
}
}else{
if(l<2) continue;
string a=vec2[k].substr(0,l-2);
int s=vec2[k][l-1]-'0';
if(a==quanxian){
if(max<s){
max=s;
shu=1;
continue;
}
}
}
}else{
if(l<2) continue;
string a=vec2[k].substr(0,l-2);
string b=quanxian.substr(0,len-2);
if(a==b){
if(vec2[k][l-1]>=quanxian[len-1]){
flag=true;
puts("true");
break;
}
}
}
}
if(flag) break;
}
if(flag) continue;
if(shu){
printf("%d\n",max);
continue;
}
puts("false");
}
return 0;
}