#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;const int inf=1<<30;const int nMax=1005;const int mMax=250000;class nodea{public: int id; nodea *p[30]; nodea(){ int i; id=-1; for(i=0;i<26;i++)p[i]=NULL; }};nodea *root;int cnt;int getnum(char *s){ int i; nodea *r=root; int l=strlen(s); for(i=0;i<l;i++){ if(r->p[s[i]-'A']==NULL){ r->p[s[i]-'A']=new nodea(); } r=r->p[s[i]-'A']; } if(r->id==-1){ r->id=cnt; cnt++; } return r->id;}class node{ public: int c,u,v,next;};node edge[mMax];int ne, head[nMax];int cur[nMax], ps[nMax], dep[nMax],n;void addedge(int u, int v,int w){ edge[ne].u = u; edge[ne].v = v; edge[ne].c = w; edge[ne].next = head[u]; head[u] = ne ++; edge[ne].u = v; edge[ne].v = u; edge[ne].c = 0; edge[ne].next = head[v]; head[v] = ne ++;}int dinic(int s, int t) { int tr, res = 0; int i, j, k, f, r, top; while(1) { memset(dep, -1, sizeof(dep)); for(f = dep[ps[0]=s] = 0, r = 1; f != r;) for(i = ps[f ++], j = head[i]; j; j = edge[j].next) if(edge[j].c && dep[k=edge[j].v] == -1) { dep[k] = dep[i] + 1; ps[r ++] = k; if(k == t) { f = r; break; } } if(dep[t] == -1) break; memcpy(cur, head, sizeof(cur)); i = s, top = 0; while(1) { if(i == t) { for(tr =inf, k = 0; k < top; k ++) if(edge[ps[k]].c < tr) tr = edge[ps[f=k]].c; for(k = 0; k < top; k ++) { edge[ps[k]].c -= tr; edge[ps[k]^1].c += tr; } i = edge[ps[top=f]].u; res += tr; } for(j = cur[i]; cur[i]; j = cur[i] =edge[cur[i]].next) { if(edge[j].c && dep[i]+1 == dep[edge[j].v]) break; } if(cur[i]) { ps[top ++] = cur[i]; i = edge[cur[i]].v; } else { if(top == 0) break; dep[i] = -1; i = edge[ps[-- top]].u; } } } return res;}char str[nMax][100];int cost[nMax];int tag[nMax],tag1[nMax];int main(){ char ch[100]; int a,b,i,j,t,m,sum,c1,c2; scanf("%d",&t); while(t--){ sum=c1=c2=0; ne=2; cnt=1; memset(tag,0,sizeof(tag)); memset(head,0,sizeof(head)); root=new nodea(); scanf("%d",&a); for(i=1;i<=a;i++){ scanf("%s%d",str[i],&cost[i]); getnum(str[i]); } scanf("%d",&b); for(i=1;i<=a;i++){ addedge(i,a+b+1,cost[i]); } for(i=a+1;i<=a+b;i++){ scanf("%s%d%d",str[i],&cost[i],&m); getnum(str[i]); sum+=cost[i]; addedge(0,i,cost[i]); while(m--){ scanf("%s",ch); addedge(i,getnum(ch),inf); } } n=a+b+1; cout<<sum-dinic(0,n)<<endl; for(i=head[0];i;i=edge[i].next){ if(edge[i].c!=0){ tag[c1]=edge[i].v; c1++; } } cout<<c1<<endl; for(i=0;i<c1;i++){ cout<<str[tag[i]]<<endl; for(j=head[tag[i]];j;j=edge[j].next){ if(edge[j].v!=0){ tag1[c2]=edge[j].v; c2++; } } } cout<<c2<<endl; for(i=0;i<c2;i++){ cout<<str[tag1[i]]<<endl; } } return 0;}