/*
分析:
简单prim,还connected的边将其长度记为0就行了。
在k次读入的时候,每次给了t个数,不用进行C(t,2)次赋值让map[a][b]=map[b][a]=0,
只用进行t-1次就行了,让这t个数成一个链啊什么的,不用出现回路。
2012-06-17
*/
#include"stdio.h"
#include"stdlib.h"
struct A
{
int a,b;
int len;
}E[25011];
int cmp(const struct A *a,const struct A *b)
{
return a->len-b->len;
}
int main()
{
int T;
int n,m,k;
int i,l;
int tail;
int ans;
int flag;
int map[501][501];
int hash[501];
int a,b,len;
int t,temp[501],i2;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++)
for(l=1;l<=n;l++)
{
if(i==l)map[i][l]=map[l][i]=0;
else map[i][l]=map[l][i]=11111111;
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&len);
map[a][b]=map[b][a]=map[a][b]>len?len:map[a][b];
}
for(i=0;i<k;i++)
{
scanf("%d",&t);
for(l=1;l<=t;l++) scanf("%d",&temp[l]);
for(i2=2;i2<=t;i2++)map[temp[i2]][temp[i2-1]]=map[temp[i2-1]][temp[i2]]=0;
}
tail=0;
for(i=1;i<n;i++)
for(l=i+1;l<=n;l++)
{
if(map[i][l]!=11111111)
{
E[tail].a=i;
E[tail].b=l;
E[tail].len=map[i][l];
tail++;
}
}
qsort(E,tail,sizeof(E[0]),cmp);
for(i=1;i<=n;i++) hash[i]=1;
ans=0;
hash[E[0].a]=0;
for(i=0;i<tail;i++)
{
flag=hash[E[i].a]+hash[E[i].b];
if(flag==1)
{
ans+=E[i].len;
hash[E[i].a]=hash[E[i].b]=0;
i=0;
}
}
flag=0;
for(i=1;i<=n;i++) if(hash[i]) {flag=1;break;}
if(flag)printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}