#include "race.h"
#include<bits/stdc++.h>
using namespace std;
int n, k, cnt;
const int maxN = 200000;
const int maxK = 1000002;
vector<pair<int, int>> AdjList[maxN];
vector<int> exists;
int padre[maxN];
int subTreeSize[maxN];
pair<int, int> prov[maxN];
int lengths[maxK];
int centroidToLength[maxK];
void preProcess(int node){
subTreeSize[node] = 1;
for(pair<int, int>& next: AdjList[node]){
if(next.first != padre[node] && exists[next.first]){
padre[next.first] = node;
preProcess(next.first);
subTreeSize[node] += subTreeSize[next.first];
}
}
}
int find_Centroid(int node, int sze){
for(int i = 0; i < AdjList[node].size(); ++i){
pair<int, int> next = AdjList[node][i];
if(next.first == padre[node] || !exists[next.first]) continue;
if(subTreeSize[next.first] > (sze/2)) {
i = -1;
node = next.first;
}
}
return node;
}
void findDistances(int node, int currDist, int numEdges){
if(currDist > k) return;
prov[cnt] = {currDist, numEdges};
cnt++;
for(pair<int, int>& next: AdjList[node]){
if(exists[next.first] && next.first != padre[node]){
padre[next.first] = node;
findDistances(next.first, currDist+next.second, numEdges+1);
}
}
}
int solveSubTree(int node){
padre[node] = node;
preProcess(node);
int sze = subTreeSize[node];
node = find_Centroid(node, sze);
padre[node] = node;
int ans = 1e9;
for(pair<int, int>& next: AdjList[node]){
if(next.first == padre[node]) continue;
if(!exists[next.first]) continue;
padre[next.first] = node;
cnt = 0;
findDistances(next.first, next.second, 1);
for(int i = 0; i < cnt; ++i){
pair<int, int> val = prov[i];
int d = val.first;
int edges = val.second;
if(centroidToLength[k-d] == node)ans = min(ans, lengths[k - d] + edges);
}
for(int i = 0; i < cnt; ++i){
pair<int, int> val = prov[i];
int d = val.first;
int edges = val.second;
if(centroidToLength[d] != node) {
lengths[d] = edges;
centroidToLength[d] = node;
}
else lengths[d] = min(lengths[d], edges);
}
}
if(centroidToLength[k] == node) ans = min(ans, lengths[k]);
exists[node] = 0;
for(pair<int, int>& next: AdjList[node]){
if(exists[next.first]) ans = min(ans, solveSubTree(next.first));
}
return ans;
}
int best_path(int N, int K, int H[][2], int L[])
{
n = N;
k = K;
exists = vector<int>(N, 1);
memset(centroidToLength, -1, sizeof(centroidToLength));
int a, b, c;
for(int i = 0; i < N-1; ++i){
a = H[i][0];
b = H[i][1];
c = L[i];
AdjList[a].push_back({b, c});
AdjList[b].push_back({a, c});
}
int res = solveSubTree(0);
if(res == 1e9) return -1;
return res;
}