/*
 1 sÚ XgÉÜÜêéACeÌ n (®)
 2 sÚ æ 1 ÌACeÌîñ i p (¼p¶ñ ®;¼póæØè)
 3 sÚ æ 2 ÌACeÌîñ
 :
 n+1 sÚ æ n ÌACeÌîñ
 n+2 sÚ BàVsÌ m (®)
 n+3 sÚ æ 1 ÌBàVsÌîñ o k q1 q2 EEE qk
 (¼p¶ñ ® ¼p¶ñ EEE ¼p¶ñ;¼póæØè)
 n+4 sÚ æ 2 ÌBàVsÌîñ
 :
 n+m+2 sÚ æ m ÌBàVsÌîñ
 n+m+3 sÚ wè³ê½ACe¼ (¼p¶ñ)
 
 ACeXgÉÜÜêéACeÌíÞ n Í 1 Èã 100 ÈºÌ®
 eACeðwü·éêÌli p Í 0 Èã 1000000 Èº
 ACeÌ¼O i Í 1 ¶Èã 100 ¶Èº ÌAt@xbg©çÈé¼p¶ñ
 BàVsÌíÞ m Í 0 Èã 100 ÈºÌ®
 1 ÂÌBàVsÍACeÌ¼O o A»êðìé½ßÉKvÈACeÌÂ k A k ÂÌACe ¼ q ÌXgÉæÁÄ^¦çêÜ·Bk Í 100 ÈºÆµÜ·B
*/

#include <cstdio>
#include <string>
#include <map>
#include <vector>
using namespace std;

map <string, int> item;
map <string, vector<string> > recipe;
int n, m, k, money;
char name[101], o[101], material[101];

int dp(string str);

int main(void)
{
    
    while (1){
        scanf("%d", &n);
        if (n == 0) break;
        for (int i = 0; i < n; i++){
            scanf("%s %d", name, &money);
            item.insert( map<string, int>::value_type( name, money ) );
        }
        
        scanf("%d", &m);
        for (int i = 0; i < m; i++){
            scanf("%s %d", o, &k);
            for (int j = 0; j < k; j++){
                scanf("%s", material);
                recipe[o].push_back(material);
            }
        }
        
        scanf("%s", name);
        printf("%d\n", dp(name));
        
        item.clear();
    }
    
    return (0);
}

int dp(string str)
{
    int ans = 0;
    
    if (recipe[str].size() != 0){
        for (int i = 0; i < recipe[str].size(); i++){
            ans += dp(recipe[str][i]);
        }
    }
    else {
        ans = item[str];
    }
    
    if (item[str] < ans) ans = item[str];
    
    return ans;
}