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

#define rep2(i,a,b) for(int i=(a);i<(b);i++)
#define rep(i,n) rep2(i,0,n)
#define sz(x) ((int)(x).size())
#define MAX_V 40
int INF = 1e9;
const int MM = 1234567;
typedef pair<int,int> P;

struct edge{ int to, cap,cost,rev; };

int V;
vector<edge> G[MAX_V];
int h[MAX_V];
int dist[MAX_V];
int prevv[MAX_V],preve[MAX_V];

int dbg = 0;

void add_edge(int from,int to,int cap,int cost){
	if(dbg){
		cout<<"ae "<<from<<" "<<to<<" "<<cap<<" "<<cost<<endl;
	}
	G[from].push_back((edge){to,cap,cost,(int)G[to].size()});
	G[to].push_back({from,0,-cost,(int)G[from].size()-1});
}
long min_cost_flow(int s,int t,int f){
	long res = 0;
	fill(h,h+V,INF);
	h[s] = 0;
	while(true){
		int flag = 0;
		//cout << "--" << endl;
		for(int v = 0 ; v < V ; v++){
			for(int i = 0 ; i < G[v].size(); i++){
				edge &e = G[v][i];
				if( e.cap > 0 && h[e.to] > h[v] + e.cost){
					h[e.to] = h[v] + e.cost;
					flag = true;
					//cout << "==" << endl;
				}
			}
		}
		if(!flag) break;
	}
	if(dbg){rep(i,V)cout<<i<<": "<<h[i]<<" "<<endl;}
	while( f > 0 ){
		fill(dist,dist+V,INF);
		priority_queue<P,vector<P>,greater<P> > que;
		fill(dist,dist+V,INF);
		dist[s] = 0;
		que.push(P(0,s));
		while( !que.empty() ){
			P p = que.top(); que.pop();
			int v = p.second;
			if( dist[v] < p.first ) continue;
			for(int i = 0 ; i < G[v].size(); i++){
				edge &e = G[v][i];
				if( e.cap > 0 && dist[e.to] > dist[v] + e.cost + h[v] - h[e.to] ){
					dist[e.to] = dist[v] + e.cost + h[v] - h[e.to];
					prevv[e.to] = v;
					preve[e.to] = i;
					que.push(P(dist[e.to],e.to));
				}
			} 
		}
		if(dbg){rep(i,V)if(dist[i]<INF)cout<<i<<": "<<dist[i]<<" "<<endl;}

		if( dist[t] == INF){
			if(dbg)cout<<"A!"<<endl;
			return res; // !!!
		}
		for(int v = 0 ; v < V ; v++) h[v] += dist[v];
		
		int d = f;
		for(int v = t ; v != s ; v = prevv[v]){
			d = min(d,G[prevv[v]][preve[v]].cap);
		}

		if(h[t] >= 0){ // !!!
			if(dbg)cout<<"B!"<<endl;
			return res;
		}

		f -= d;
		res += d * h[t];


		for(int v = t ; v != s ; v = prevv[v] ){
			edge &e = G[prevv[v]][preve[v]];
			e.cap -= d;
			G[v][e.rev].cap += d;
		}
	}
	return res;
}

int bsum;


void add_edge2(int from, int to, int cost, int mincap, int maxcap){
	if(dbg)cerr<<from<<" "<<to<<" "<<cost<<" "<<mincap<<" "<<maxcap<<endl;
	bsum += mincap;
	add_edge(from, to, maxcap - mincap, cost);
	add_edge(from, to, mincap, cost-MM);
}

int N, M;
int cond[11][27];
int card[11][27];

int main(){
	cin>>N;
	rep(i,N){
		//cin>>a[i]>>b[i];
		char a; int b;
		cin>>a>>b;
		cond[b][a-'A'] = 1;
	}
	/*rep(i,10)rep(j,26){
		cout<<cond[i][j]<<(j==25?"\n":" ");
	}*/
	rep(i,10)rep(j,26) card[i][j] = INF;
	cin>>M;
	rep(i,M){
		char c; int d; int e;
		cin>>c>>d>>e;
		card[d][c-'A'] = min(card[d][c-'A'], e);
	}
	/*rep(i,10)rep(j,26){
		cout<<cond[i][j]<<(j==25?"\n":" ");
	}*/
	/*rep(i,10)rep(j,26){
		cout<<card[i][j]<<(j==25?"\n":" ");
	}*/
	int ans = INF;
	rep(mask,1<<10){ // buy
		//if(mask == (1<<3)) dbg = 1; else dbg = 0;

		V = 38;
		bsum = 0;
		rep(i,V)G[i].clear();
		int s = 36, t = 37;
		rep(i,10)if(mask>>i&1){
			add_edge2(s, 0+i, 0, 1, 36);
		}
		int survive[26] = {};
		rep(i,10)rep(j,26){
			if(cond[i][j] && !(mask>>i&1)){
				survive[j] = 1;
			}
		}
		if(dbg){
			rep(j,26)cout<<survive[j];cout<<endl;
		}
		rep(j,26)if(survive[j]){
			add_edge2(10+j, t, 0, 1, 36);
		}
		rep(i,10)rep(j,26)if(card[i][j] < INF){
			if(!(mask>>i&1)) continue;
			if(survive[j]){
				add_edge2(0+i, 10+j, card[i][j], 0, 1);
			}else{
				add_edge2(0+i, t, card[i][j], 0, 1);
			}
		}

		int res = min_cost_flow(s, t, 36);
		if(dbg)cout<<res<<" "<<bsum<<" "<<res+MM*bsum<<endl;
		res += MM * bsum;
		ans = min(ans, res);
	}
	if(ans >= MM)cout<<-1<<endl;
	else cout<<ans<<endl;
}

Measured memory_bytes: 1280