#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define MAX_N 20002 #define MAX_E 50001 struct edge{ int u, v, cost; }; int par[MAX_N]; int Rank[MAX_N]; edge es[MAX_E]; int V, E; bool compare(const edge &e1, const edge &e2) { return e1.cost<e2.cost; } void init(int N) { for (int i = 0; i<N; i++) { par[i] = i; Rank[i] = 0; } } int find(int x) { if (par[x] == x) return x; else return par[x]=find(par[x]); } void unite(int x, int y) { x = find(x); y = find(y); if (x == y) return; if (Rank[x]>Rank[y]) swap(x, y); par[x] = y; Rank[x]++; } bool same(int x, int y) { x = find(x); y = find(y); return x == y; } int krus() { sort(es, es + E, compare); init(V); int ret = 0; for (int i = 0; i<E; i++) { if (same(es[i].u, es[i].v) == false) { ret += es[i].cost; unite(es[i].u, es[i].v); } } return ret; } int main() { int count; int N, M; scanf("%d", &count); for (int i = 0; i<count; i++) { scanf("%d%d%d", &N, &M, &E); for (int j = 0; j<E; j++) { int v, cost; scanf("%d%d%d", &es[j].u, &v, &cost); es[j].v = v + N; es[j].cost = -cost; } V = M + N; printf("%d\n", V * 10000 + krus()); } return 0; }