1 //我看过Discuss说不能用克鲁斯卡尔因为有很多边
2 //但是只能用G++过,C++的确超时
3 #include <stdio.h>
4 #include <string.h>
5 #include <algorithm>
6 using namespace std;
7
8 struct node
9 {
10 int a, b, cost;
11 }c[30000];
12 int fa[505];
13
14 void init(int n)
15 {
16 for (int i = 1; i <= n; i++)
17 fa[i] = i;
18 }
19
20 bool cmp(node x, node y)
21 {
22 return x.cost<y.cost;
23 }
24
25 int find(int x)
26 {
27 if (fa[x] != x) fa[x] = find(fa[x]);
28 return fa[x];
29 }
30
31 int main()
32 {
33 int n, k, m, ncase;
34 scanf("%d", &ncase);
35 while (ncase--)
36 {
37 scanf("%d %d %d", &n, &k, &m);
38 init(n); //初始化
39 for (int i = 0; i<k; i++)
40 scanf("%d %d %d", &c[i].a, &c[i].b, &c[i].cost);
41 for (int i = 1; i <= m; i++)
42 {
43 int x, pos, pos1;
44 scanf("%d %d", &x, &pos);
45 for (int j = 1; j<x; j++)
46 {
47 scanf("%d", &pos1);
48 c[k].a = pos, c[k].b = pos1, c[k].cost = 0;
49 pos = pos1;
50 k++;
51 }
52 }
53
54 sort(c, c + k, cmp);
55 int sum = 0;
56 for (int i = 0; i<k; i++)
57 {
58 int x = find(c[i].a);
59 int y = find(c[i].b);
60 if (x != y)
61 sum += c[i].cost, fa[x] = y;
62 }
63
64 int count = 0;
65 for (int i = 1; i <= n; i++)
66 if (fa[i] == i)
67 count++;
68
69 if (count != 1)
70 printf("-1
");
71 else
72 printf("%d
", sum);
73 }
74 return 0;
75 }