#include<iostream>
#include<string>
#include<vector>
#include<map>

using namespace std;

class Use_Item{
	public:
		
		void Set_Item(string s, int num){		//zñÌY¦Æ¶ñðnµÄ °Ä­¾³¢
			Item_List[num] = s;
		}
		int cont;
		string Item_List[100];
};

int n,m,t;

//i¨Xg
vector<pair<string,int> > item;

//ÅIIÉìéACe
string make_item;

//ÀÛÌVs
Use_Item ui[100];

//VsÉ éACeXg
string list[100];

int saiki(string make_item)
{
	int total = 0;
	int kane = 0;
	bool find = false;
	
	//ACeðT·
	for(int i = 0; i < n; i++){
		if(item[i].first == make_item){
			kane = item[i].second;
		}
	}
//	cout << make_item << "ðTõ" << endl;
	//VsðTµÄìéACeª é©Ç¤©ðõ
	for(int i = 0; i < m; i++){
		if(list[i] == make_item){
			find = true;
			//©Â©Á½çAVs©çACeXgÌACeðnµÄÄA
			for(int j = 0; j < m; j++){
				total += saiki(ui[i].Item_List[j]);
			}
			return min(kane, total);
		}
	}
	
	if(find == false){
		return kane;
	}
}

int main()
{
	for(;;){
		string temp, temp2;
		
		//ACeÌÍn
		cin >> n;
		if(n == 0){
			break;
		}
		
		for(int i = 0; i < n; i++){
			cin >> temp;
			cin >> t;
			item.push_back(make_pair(temp,t));
		}
		
		//VsÌÍm
		cin >> m;
		
		for(int i = 0; i < m; i++){
			cin >> temp;
			cin >> t;
			
			list[i] = temp;
			ui[i].cont = t;
			for(int j = 0; j < t; j++){
				cin >> temp2;
				ui[i].Set_Item(temp2,j);
			}
		}
		cin >> make_item;
		
		
		//±±ÜÅCvbg
		
		cout << saiki(make_item) << endl;
	}
}