// Arup Guha
// 4/10/20
// letters

import java.util.*;

public class letters {

	public static int nW;
	public static int[][] freq;
	public static ArrayList[] letterScores;
	public static int[] maxfreq;
	public static int sumTiles;
	
	public static void main(String[] args) {
	
		Scanner stdin = new Scanner(System.in);
		int nC = stdin.nextInt();
		
		for (int loop=0; loop<nC; loop++) {
		
			sumTiles = 0;
			maxfreq = new int[26];
			int nTiles = stdin.nextInt();
			letterScores = new ArrayList[26];
			for (int i=0; i<26; i++)
				letterScores[i] = new ArrayList<Integer>();
			
			// Store tiles in lists for each letter.
			for (int i=0; i<nTiles; i++) {
				int idx = stdin.next().charAt(0) - 'a';
				int pts = stdin.nextInt();
				letterScores[idx].add(pts);
				maxfreq[idx]++;
				sumTiles += pts;
			}
			
			// Store tiles in order we will use them.
			for (int i=0; i<26; i++) {
				Collections.sort(letterScores[i]);
				Collections.reverse(letterScores[i]);
			}
			
			// Store just freq of letters in words.
			nW = stdin.nextInt();
			freq = new int[nW][26];
			for (int i=0; i<nW; i++) {
				char[] s = stdin.next().toCharArray();
				for (int j=0; j<s.length; j++)
					freq[i][s[j]-'a']++;
			}
			
			int res = -sumTiles;
			for (int mask=0; mask<(1<<nW); mask++) {
			
				int[] thisf = new int[26];
				boolean ok = true;
				for (int j=0; j<nW; j++) {
					if ((mask & (1<<j)) != 0) {
						for (int z=0; z<26; z++) {
							thisf[z] += freq[j][z];
							if (thisf[z] > maxfreq[z]) {
								ok = false;
								break;
							}
						}
					}
					if (!ok) break;
				}
				if (!ok) continue;
				
				int tmp = 0;
				for (int i=0; i<26; i++) {
				
					for (int z=0; z<thisf[i]; z++)
						tmp += (Integer)letterScores[i].get(z);
				}
				res = Math.max(res, tmp-(sumTiles-tmp));
			}
			
			System.out.println(res);
		}
	}
}