import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
/*
Crafted on: 16/06/20
*/
public class Main {
static int MAX_NODES = (int) 2e5;
static int MAX_DEPTH = 20;
static int[] depth = new int[MAX_NODES];
static long[] maxDownPath = new long[MAX_NODES];
static long[] maxUpPath = new long[MAX_NODES];
static int[][] ances = new int[MAX_DEPTH][MAX_DEPTH];
public class Edge {
int next;
long weight;
public Edge(int next, long weight){
this.next = next;
this.weight = weight;
}
}
private final int n;
private final Scanner reader;
private final List<List<Edge>> tree;
public Main
(int n, Scanner reader
) throws IOException { this.n = n;
this.reader = reader;
this.tree = new ArrayList<>();
for (int i = 0; i < n; i++) {
tree.add(new ArrayList<>());
}
depth[0] = 0;
readTree();
dfs(0, -1, 0);
for(int k=1; k<MAX_DEPTH ; k++)
for(int i=0;i<n; i++){
int nextNode = ances[k-1][i];
if(nextNode != -1)
ances[k][i] = ances[k-1][nextNode];
}
}
public int walk(int node, int k){
for(int i=0; i<MAX_DEPTH; i++)
if((1<<i & k) >0)
node = ances[i][node];
return node;
}
public int findLCA(int u, int v){
if(depth[u] < depth[v])
v = walk(v, depth[v] -depth[v]);
if(depth[v] < depth[u])
u = walk(u, depth[u] - depth[v]);
if(u==v)
return u;
for(int i=MAX_DEPTH-1; i>=0 && (u != v); i--){
if(ances[i][u] != ances[i][v]) {
u = ances[i][u];
v = ances[i][v];
}
}
return ances[0][u];
}
public long maxPath(int u, int v, long weight){
long ans = maxDownPath[u] + maxDownPath[v] + weight;
int ance = findLCA(u, v);
return Math.
max(ans, maxUpPath
[u
] + maxUpPath
[v
] - 2*maxUpPath
[ance
]); }
for(int i=0; i < n-1; i++) {
int u = reader.nextInt();
int v = reader.nextInt();
long weight = reader.nextLong();
tree.get(u - 1).add(new Edge(v - 1, weight));
tree.get(v - 1).add(new Edge(u - 1, weight));
}
}
public void dfs(int node, int parent, long pathWeight){
long maxWght = 0;
maxUpPath[node] = pathWeight;
for(Edge edge: tree.get(node)){
if(edge.next != parent){
depth[edge.next] = depth[node] + 1;
ances[0][edge.next] = node;
dfs(edge.next, node, pathWeight + edge.weight);
maxWght
= Math.
max(maxWght, maxDownPath
[edge.
next]+ edge.
weight); maxWght
= Math.
max(maxWght, edge.
weight); }
}
maxDownPath[node] = maxWght;
}
Scanner reader
= new Scanner
(System.
in); // CODE GOES HERE
int t = reader.nextInt();
while(t-- > 0){
int n = reader.nextInt();
int q = reader.nextInt();
Main main = new Main(n, reader);
while(q-- >0){
int u = reader.nextInt();
int v = reader.nextInt();
long wt = reader.nextLong();
writer.
write(String.
valueOf(main.
maxPath(u
-1, v
-1, wt
))); writer.newLine();
}
}
writer.flush();
writer.close();
}
}