#include <bits/stdc++.h>
using namespace std;

//define
#define int long long
#define UNIQUE(v) v.erase(unique(all(v)), v.end());
#define ZIP(v) sort(all(v)),UNIQUE(v)
#define ADD(a, b) a = (a + b) % mod
#define SUB(a, b) a = (a+mod-b)%mod
#define MUL(a, b) a = (a * b) % mod
#define repi(i,m,n) for(int i = m;i < n;i++)
#define drep(i,n,m) for(int i = n;i >= m;i--)
#define rep(i,n) repi(i,0,n)
#define rrep(i,n) repi(i,1,n+1)
#define chmin(x,y) x = min(x,y)
#define chmax(x,y) x = max(x,y)
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(), v.rend()
#define dmp(x,y) make_pair(x,y)
#define pb(x) push_back(x)
#define fi first
#define se second
//template
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p){
  os << p.first << " " << p.second;return os;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v){
  for (auto it = v.begin();it != v.end();++it){
    if (it != v.begin())os << " ";os << *it;
  }return os;
}
template<typename T, int SIZE>
int array_length(const T (&)[SIZE]){return SIZE;}
template<typename T, int N>
void print(const T (&a)[N], int s = N, int t = -1, bool f = true){
	if(t == -1){rep(i,s){if(i)cout << " ";cout << a[i];}}
	else repi(i,s,t){if(i!=s)cout << " ";cout << a[i];}
	if(f)cout << "\n";
}
template<typename T, int N1, int N2>
void print(const T (&a)[N1][N2], int h = N1, int w = N2){
	rep(i,h){rep(j,w){cout << a[i][j] << " \n"[j==w-1];}}
}
//typedef
typedef pair<int,int> P;
typedef pair<int, P> PP;
typedef pair<P, int> Pi;
typedef vector<int> vi;
typedef deque<int> dq;
const int inf = 1e9+7;
const int INF = 1e18+7;


//DFS: 全ての点から深さ優先探索して、その帰りがけ順
class TopologicalSort{
public:
	int n;
	vector<int> ans, used;
	vector<vector<int> > G;
	void init(int N){
		n = N;
		used.resize(n);G.resize(n);
	}
	void add_edge(int from, int to){	//DAG
		G[from].pb(to);
	}
	void dfs(int v){
		if(used[v])return;
		used[v] = 1;
		for(int u: G[v])dfs(u);
		ans.pb(v);
	}
	bool sort(){
		rep(i,n)dfs(i);
		reverse(all(ans));
		return ans.size() == n;		//できなかった場合falseが返る
	}
};


int v[200];
vector<int> rec[200];
map<string, int> zip;
void init(){
	rep(i,200)v[i] = 0;
	rep(i,200)rec[i].resize(0);
	zip.clear();
}

signed main(){
	while(1){
		int n, m;
		cin >> n;
		if(n == 0)break;
		init();
		TopologicalSort T;T.init(n);
		rep(i,n){
			string str;int tmp;
			cin >> str >> tmp;
			zip[str] = i;v[i] = tmp;
		}
		cin >> m;
		rep(i,m){
			string str1, str2;int N;
			cin >> str1;cin >> N;
			rep(j,N){
				cin >> str2;
				T.add_edge(zip[str2], zip[str1]);
				rec[zip[str1]].pb(zip[str2]);
			}
		}
		
		T.sort();
		vector<int> order = T.ans;
		rep(i,n){
			int sum = 0, idx = order[i];
			if(rec[idx].size() == 0)continue;
			rep(j,rec[idx].size()){
				int r = rec[idx][j];
				sum += v[r];
			}
			chmin(v[idx], sum);
		}
		string t;cin >> t;
		cout << v[zip[t]] << endl;
		
	}
	return 0;
}





