#include"algorithm" using namespace std; int pre[600]; int find(int k) { if(k==pre[k]) return k; return pre[k]=find(pre[k]); } struct node { int x,y; int z; }a[26000]; struct xx { int x1,y1; int z1; }aa[26000]; int cmp(xx a,xx b) { return a.z1<b.z1; } int main() { int T,n,m,k,t,i,aaa[200],f[200],f1,f2,ans,flag,j,w; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); for(i=1;i<=n;i++) pre[i]=i; for(i=0;i<m;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z); for(i=0;i<k;i++) { scanf("%d",&t); for(j=0;j<t;j++) { scanf("%d",&aaa[j]); f[j]=find(aaa[j]); } for(j=1;j<t;j++) pre[f[j]]=f[0]; } w=0; for(i=0;i<m;i++) { f1=find(a[i].x); f2=find(a[i].y); if(f1!=f2) { aa[w].x1=a[i].x; aa[w].y1=a[i].y; aa[w].z1=a[i].z; w++; } } sort(aa,aa+w,cmp); ans=0; for(i=0;i<w;i++) { f1=find(aa[i].x1); f2=find(aa[i].y1); if(f1!=f2) { ans+=aa[i].z1; pre[f1]=f2; } } flag=0; for(i=1;i<=n;i++) if(i==pre[i]) flag++; if(flag==1) printf("%d\n",ans); else printf("-1\n"); } return 0; }