/**
* Author: Lưu Diệp Thành (Save Diệp Thành)
* Le Hong Phong High School for the Gifted (i2528)
**/
#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define ll long long
#define ushort unsigned short
#define FOR(i,l,r) for(int i = (l), _r = (r); i <= _r; i++)
#define FORN(i,r,l) for(int i = (r), _l = (l); i >= _l; i--)
#define endl '\n'
#define sz(x) (int)x.size()
#define fi first
#define se second
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define MASK(x) (1LL << (x))
#define BIT(x,i) (((x) >> (i)) & 1)
#define ins insert
#define segleft (id<<1)
#define segright (id<<1|1)
#define TIME (1.0 * clock() / CLOCKS_PER_SEC)
const int MOD = 1e9+7;
const int N = 2e5+5;
vector<pair<int,int>> edge[N];
map<int,int> mp[N];
int dist[N], high[N];
int node, s;
int ans = LLONG_MAX;
void dfs(int u, int p) {
high[u] = high[p] + 1;
for(auto[v,w] : edge[u]) if (v!=p) {
dist[v] = dist[u] + w;
dfs(v,u);
}
}
void SmallToLarge(int u, int p) {
for(auto[v,w] : edge[u]) if (v!=p) {
SmallToLarge(v, u);
if (sz(mp[u]) < sz(mp[v])) swap(mp[u], mp[v]);
for(pair<int,int> cur : mp[v]) {
int d1 = cur.fi, len = cur.se;
if (s - 2*dist[u] - d1 >= 0) {
int d2 = s - 2*dist[u] - d1;
if (mp[u].count(d2)) {
ans = min(ans, len + mp[u][d2] - 2*high[u]);
}
}
}
for(pair<int,int> cur : mp[v]) {
if (mp[u].count(cur.fi)) {
mp[u][cur.fi] = min(mp[u][cur.fi], cur.se);
} else {
mp[u][cur.fi] = cur.se;
}
}
}
if (s - dist[u]) {
int d = s - dist[u];
if (mp[u].count(d)) {
ans = min(ans, mp[u][d] - high[u]);
}
}
if (mp[u].count(dist[u])) {
mp[u][dist[u]] = min(mp[u][dist[u]], high[u]);
} else {
mp[u][dist[u]] = high[u];
}
}
int best_path(int n, int k, int h[][2], int l[]) {
node = n;
s = k;
FOR(i, 0, node-2) {
int u = h[i][0] + 1, v = h[i][1] + 1, w = l[i];
edge[u].pb({v, w});
edge[v].pb({u, w});
}
dfs(1, 0);
SmallToLarge(1, 0);
return (ans == LLONG_MAX ? -1 : ans);
}