#include "race.h"
#include <bits/stdc++.h>
#define ll long long
bool dead[200010];
ll size[200010];
ll dist[200010];
ll length[200010];
ll min = 1e18;
ll Kg;
std::vector<std::vector<std::pair<ll,std::pair<ll,ll>>>> cenDist;
std::vector<std::vector<std::pair<ll,ll>>> adj;
ll find_size(ll curr,ll par){
//std::cout << "P" << curr;
ll sum=1;
for(auto [to,weight]:adj[curr]){
if(dead[to]||to==par)continue;
sum+=find_size(to,curr);
}
size[curr]=sum;
return sum;
}
ll find_centroid(ll curr,ll par,ll total){
for(auto [to,weight]:adj[curr]){
if(dead[to]||to==par)continue;
if(size[to]>total/2){
return find_centroid(to,curr,total);
}
}
return curr;
}
void find_dist(ll curr,ll par,ll cen,ll dist,ll length,ll id){
cenDist[cen].push_back({dist,{length,curr}});
for(auto [to,weight]:adj[curr]){
if(dead[to]||to==par)continue;
find_dist(to,curr,cen,dist+weight,length+1,id);
}
}
void calculate_dist(ll curr,ll par,std::vector<std::pair<ll,ll>>& v,std::map<ll,ll> mp){
if(mp.find(Kg-dist[curr])!=mp.end())min=std::min(min,mp[Kg-dist[curr]]+length[curr]);
v.push_back({dist[curr],length[curr]});
for(auto [to,weight]:adj[curr]){
if(dead[to]||to==par)continue;
dist[to]=dist[curr]+weight;
length[to]=length[curr]+1;
calculate_dist(to,curr,v,mp);
}
}
void decompose(ll curr){
ll total=find_size(curr,curr);
ll cen=find_centroid(curr,curr,total);
//find_dist(cen,-1,cen,0,0);
dead[cen]=true;
length[cen]=0;
dist[cen]=0;
std::map<ll,ll> mp;
mp[0]=0;
std::vector<std::pair<ll,ll>> v;
ll num=0;
//std::cout << total << ' ' << cen << '\n';
for(auto [to,weight]:adj[cen]){
num++;
if(dead[to])continue;
dist[to]=dist[cen]+weight,length[to]=length[cen]+1;
calculate_dist(to,cen,v,mp);
for(auto [d,l]:v){
if(mp.find(d)!=mp.end())
mp[d]=std::min(mp[d],l);
else
mp[d]=l;
}
v.clear();
//for(auto [d,l]:mp)std::cout << num << ' ' << d << ' ' << l << '\n';
}
for(auto [to,weight]:adj[cen]){
if(dead[to])continue;
decompose(to);
}
}
int best_path(int N, int K, int H[][2], int L[])
{
Kg=K;
adj.resize(N+5);
cenDist.resize(N+5);
for(ll i=0;i<N;i++){
adj[H[i][0]].push_back({H[i][1],L[i]});
adj[H[i][1]].push_back({H[i][0],L[i]});
}
decompose(0);
if(min>=1e9)min=-1;
return min;
}
/*
11 12
0 1 3
0 2 4
2 3 5
3 4 4
4 5 6
0 6 3
6 7 2
6 8 5
8 9 6
8 10 7
2
*/