[Cpp]
# Include <iostream>
# Include <cstdio>
# Include <cstring>
# Include <vector>
Using namespace std;
# Deprecision MAX 40000
Struct edge {
Int v, w;
};
Vector <edge> mp [MAX];
Vector <edge> query [MAX];
Bool flag [MAX];
Int pre [MAX], father [MAX], path [MAX];
Int find (int x ){
Return x = pre [x]? X: pre [x] = find (pre [x]);
}
Void LCA (int k)
{
Int I, j;
For (I = 0; I <mp [k]. size (); I ++)
{
Int a = mp [k] [I]. v;
If (! Flag [a])
{
Flag [a] = 1;
Path [a] = path [k] + mp [k] [I]. w;
LCA ();
Pre [a] = k;
For (j = 0; j <query [a]. size (); j ++)
{
Int B = query [a] [j]. v;
If (flag [B] & father [query [a] [j]. w] =-1)
{
If (a = B) father [query [a] [j]. w] = 0;
Else father [query [a] [j]. w] = path [a] + path [B]-2 * path [find (B)];
}
}
}
}
}
Int main ()
{
Int I, j, k, T, n, m, a, B;
Scanf ("% d", & T );
While (T --)
{
Scanf ("% d", & n, & m );
For (I = 1; I <= n; I ++ ){
Mp [I]. clear ();
Query [I]. clear ();
Flag [I] = 0;
Father [I] =-1;
Pre [I] = I;
Path [I] = 0;
}
Int a, B, c;
Edge X;
For (I = 1; I <n; I ++)
{
Scanf ("% d", & a, & B, & c );
X. v = B; X. w = c;
Mp [a]. push_back (X );
X. v =;
Mp [B]. push_back (X );
}
For (I = 1; I <= m; I ++)
{Www.2cto.com
Scanf ("% d", & a, & B );
X. v = B; X. w = I;
Query [a]. push_back (X );
X. v =;
Query [B]. push_back (X );
}
Flag [1] = 1;
// Path [1] = 0;
LCA (1 );
For (I = 1; I <= m; I ++)
Printf ("% d \ n", father [I]);
}
Return 0;
}