import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static int[] set;
private static void init(int n) {
set = new int[n];
for (int i = 0; i < n; i++) {
set[i] = i;
}
}
private static int group(int n) {
if(set[n] == n) return set[n];
return set[n] = group(set[n]);
}
private static void join(int a, int b) {
int A = group(a);
int B = group(b);
if(A!=B) {
set[A] = B;
}
}
private static boolean connector(int a, int b) {
int A = group(a);
int B = group(b);
return A == B;
}
static class Edge implements Comparable<Edge> {
int a;
int b;
int w;
public Edge(int a, int b, int w) {
this.a = a;
this.b = b;
this.w = w;
}
@Override
public int compareTo(Edge o) {
return o.w - this.w;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int T = Integer.parseInt(st.nextToken());
for (int t = 1; t <= T; t++) {
st = new StringTokenizer(br.readLine());
if(!st.hasMoreTokens()) st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int R = Integer.parseInt(st.nextToken());
Edge[] edge = new Edge[R];
for (int i = 0; i < R; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
edge[i] = new Edge(x, N+y, d);
}
Arrays.sort(edge);
int ans = 0;
init(N+M);
for (int i = 0; i < R; i++) {
if(!connector(edge[i].a, edge[i].b)) {
join(edge[i].a, edge[i].b);
ans += (10000- edge[i].w);
}
}
for (int i = 0; i < N+M; i++) {
group(i);
}
int[] tem = new int[N+M];
int n = 0;
for (int i = 0; i < N+M; i++) {
if(tem[set[i]] == 0) {
tem[set[i]] = ++n;
}
}
System.out.println(ans + n * 10000);
}
}
}