#pragma comment(linker, "/STACK:102400000,102400000") #include #include #include #include #include #include using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 typedef long long LL; int l[50010], r[50010], w[50010]; bool flag[50010]; vector a[50010]; int t, n, k; int Get_l(int x, int d) { for (int i = 0; i < a[x].size(); i++) if (!flag[a[x][i]]) { flag[a[x][i]] = 1; l[x] = max(l[x], Get_l(a[x][i], d)); } return l[x] - d; } int Get_r(int x, int d) { for (int i = 0; i < a[x].size(); i++) if (!flag[a[x][i]]) { flag[a[x][i]] = 1; r[x] = min(r[x], Get_r(a[x][i], d)); } return r[x] + d; } int Find() { int ll = 0, rr = INF, mid; while (ll < rr) { mid = (ll+rr) >> 1; memset(l, 0, sizeof(l)); memset(r, INF, sizeof(r)); for (int i = 1; i <= n; i++) if (w[i]) l[i] = r[i] = w[i]; memset(flag, 0, sizeof(flag)); Get_l(1, mid); memset(flag, 0, sizeof(flag)); Get_r(1, mid); bool p = 1; for (int i = 1; i <= n; i++) if (l[i] > r[i]) { p = 0; break; } if (p) rr = mid; else ll = mid + 1; } return ll; } int main() { scanf("%d", &t); while (t--) { scanf("%d%d", &n, &k); memset(w, 0, sizeof(w)); memset(l, 0, sizeof(l)); memset(r, INF, sizeof(r)); for (int i = 1; i <= n; i++) a[i].clear(); for (int i = 1, u, v; i < n; i++) { scanf("%d%d", &u, &v); a[u].push_back(v); a[v].push_back(u); } for (int i = 0, uu, ww; i < k; i++) { scanf("%d%d", &uu, &ww); w[uu] = ww; } printf("%d\n", Find()); } return 0; }