#include <bits/stdc++.h>
using namespace std;
const int mxn = 200001;
vector<pair<int, int>> adj[mxn];
map<int, int> m[mxn];
int dis[mxn];
int dep[mxn];
int ans = mxn;
int K;
void check(int v, int di, int de){
int tar = K - di + (2 * dis[v]);
if(m[v].count(tar)){
ans = min(ans, m[v][tar] + de - (2 * dep[v]));
}
}
void add(int v, int di, int de){
if(!m[v].count(di)){
m[v][di] = de;
}
else{
if(de < m[v][di]){
m[v][di] = de;
}
}
}
void dfs(int v, int p){
dep[v] = dep[p] + 1;
int ind = -1;
for(auto [i, j] : adj[v]){
if(i != p){
dis[i] = dis[v] + j;
dfs(i, v);
if(ind == -1 || m[i].size() > m[ind].size()){
ind = i;
}
}
}
if(ind != -1){
swap(m[ind], m[v]);
}
check(v, dis[v], dep[v]);
add(v, dis[v], dep[v]);
for(auto [i, j] : adj[v]){
if(i != p && i != ind){
for(auto [a, b] : m[i]){
check(v, a, b);
}
for(auto [a, b] : m[i]){
add(v, a, b);
}
}
}
}
int best_path(int n, int k, int h[][2], int l[])
{
K = k;
for(int i = 1; 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]});
}
dep[0] = -1;
dis[1] = 0;
dfs(1, 0);
return ans;
}