#include "race.h"
#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fr first
#define sc second
#define all(x) x.begin(), x.end()
#define inv(x) x, vector<x>, greater<x>
#define lsb(x) (x&-x)
#define pb push_back
#define me max_element
#define pq priority_queue
using namespace std;
using pii = pair<int, int>;
using pip = pair<int, pii>;
using ppp = pair<pii, pii>;
const int mod7 = 1000000007, mod9 = 998244353, ln = 23, inf = 1e18, N = 2e5 + 5;
struct ed{
int w, a;
};
int k, ans = inf;
vector<ed> g[N];
int depth[N], dist[N];
map<int, int> mp[N];
void merge(map<int, int>& a, map<int, int>& b, int v){
if(a.size() < b.size()) swap(a, b);
for(auto [x, dp]:b){
int need = k + 2*dist[v] - x;
if(a.count(need)){
ans = min(ans, dp + a[need] - 2*depth[v]);
}
}
for(auto[x, dp]:b){
if(a.count(x)){
a[x] = min(a[x], dp);
}
else{
a[x] = dp;
}
}
}
void dfs(int v, int p){
mp[v][dist[v]] = depth[v];
for(auto [iw, i]:g[v]){
if(i == p) continue;
depth[i] = depth[v] + 1;
dist[i] = dist[v] + iw;
dfs(i, v);
merge(mp[v], mp[i], v);
}
}
int best_path(int N, int K, int H[][2], int L[]){
k = K;
for(int i = 0; i < N-1; i++){
int a = H[i][0], b = H[i][1];
int w = L[i];
g[a].pb({w, b});
g[b].pb({w, a});
}
dfs(0, 0);
// for(int i = 0; i < n; i++){
// cout << i << ": ";
// for(auto [d, dp]:mp[i]){
// cout << d << ' ' << dp << ", ";
// }
// cout << '\n';
// }
// for(auto [d, dp]:mp[0]) cout << d << ' ' << dp << '\n';
return (ans == inf ? -1:ans);
}
// signed main(){
// int n, k; cin >> n >> k;
// int h[n-1][2], l[n-1];
// for(int i = 0; i < n-1; i++){
// cin >> h[i][0] >> h[i][1];
// }
// for(int i = 0; i < n-1; i++){
// cin >> l[i];
// }
// cout << best_path(n, k, h, l);
// }