#include <stdio.h>
#include <string.h>

struct d{char M[101];int p;int r;int rk[101];};
d t[101];
int v[101];

int func(int n){
int c=t[n].rk[0];
int a=0;
v[n]=1;
if(t[n].rk[0]==0){
return t[n].p;
}
for(int i=1;i<=c;i++){
if(v[t[n].rk[i]]==1){
a+=t[t[n].rk[i]].p;
}
else if(t[t[n].rk[i]].r==0){
a+=t[t[n].rk[i]].p;
}
else {
a+=func(t[n].rk[i]);
}
}
if(a<t[n].p)
t[n].p=a;

return t[n].p;
}
int main(void){
int n,i,j,l;
while(scanf("%d",&n),n){

int m,k,V;
char T[101];
for(i=0;i<n;i++){
scanf("%s %d",t[i].M,&t[i].p);
}
scanf("%d",&m);
for(i=0;i<m;i++){

scanf("%s",T);
for(j=0;j<n;j++){
if(!(strcmp(t[j].M,T))){
t[j].r=1;
break;
}
}
V=j;
scanf("%d",&k);
t[V].rk[0]=k;
for(j=0;j<k;j++){
scanf("%s",T);
for(l=0;l<n;l++){
if(!(strcmp(t[l].M,T))){
t[V].rk[j+1]=l;
break;
}
}
}
}
scanf("%s",T);
for(i=0;i<n;i++){
if(!(strcmp(t[i].M,T))){
break;
}
}
printf("%d\n",func(i));

for(i=0;i<101;i++){
v[i]=0;
t[i].r=0;
t[i].p=0;
}
}
}