#include<cstdio>#include<algorithm>#include<string.h>#include<functional>#include<cmath>#include<iostream>using namespace std;class node{public:int u,v;int dist;}edge[55002];int num[509];int find(int x){return x==num[x]?x:num[x]=find(num[x]);}bool cmp(node xx,node yy){return xx.dist<yy.dist;}int main(){int t;scanf("%d",&t); while(t--) { int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=0;i<=508;i++) { num[i]=i; }int a,b,x,mn=1,nn,nx,mx;for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&x);edge[i].u=a;edge[i].v=b;edge[i].dist=x;} while(k--) { int tt; int con[510]={0}; scanf("%d",&tt); for(int i=0;i<tt;++i) { scanf("%d",&con[i]); } for(int i=1;i<tt;++i) num[find(con[i])]=find(con[i-1]);//串連倖存的道路 } int xn=1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)//xn為倖存的道路數 { if(i==j)continue;if(num[j]==i)xn++; }sort(edge+1,edge+1+m,cmp);int sum=0;for(int i=1;xn<n&&i<=m;i++){int cx=find(edge[i].u),cy=find(edge[i].v);if(cx!=cy){num[cx]=cy;sum+=edge[i].dist;xn++;}}if(xn<n)//因為初始化為1所以如果能連通,xn==nsum=-1;printf("%d\n",sum);}return 0;}