#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ff first
#define ss second
#define all(x) x.begin(), x.end()
#ifdef debug
#define dbg(...) cerr<<#__VA_ARGS__<<" = ", de(__VA_ARGS__)
template<typename T>
void de(T t) {cerr<<t<<endl;}
template<typename T, typename ...U>
void de(T t, U...u) {cerr<<t<<", ", de(u...);}
#else
#define dbg(...)
#define endl "\n"
#endif
void usaco(string s) {
    freopen((s+".in").c_str(), "r", stdin);
    freopen((s+".out").c_str(), "w", stdout);
}
const int mxN=2e5;
vector<pair<int, int>> adj[mxN];
int n, k, siz[mxN], h[mxN][2], l[mxN];
bool cen[mxN];
map<ll, ll> mp;//dis, dis_min_cnt
vector<pair<ll, ll>> tmp;
ll ans=2e9;
void dfs(int v, int fa) {
    siz[v]=1;
    for(auto [u, w] : adj[v]) {
        if(u==fa||cen[u]) continue;
        dfs(u, v);
        siz[v]+=siz[u];
    }
}
 
int dfs1(int v, int fa, int sz) {
    for(auto [u, w] : adj[v]) {
        if(u==fa||cen[u]) continue;
        if(siz[u]>sz/2)
            return dfs1(u, v, sz);
    }
    return v;
}
void dfs2(int v, int fa, int cnt, ll dist) {
    if(mp.find(k-dist)!=mp.end()) {
        ans=min(ans, mp[k-dist]+cnt);
    }
    for(auto [u, w] : adj[v]) {
        if(u==fa||cen[u]) continue;
        tmp.push_back({cnt+1, dist+w});
        dfs2(u, v, cnt+1, dist+w);
    }
}
void cd(int v, int fa) {
    dfs(v, fa);
    int x=dfs1(v, fa, siz[v]);
    mp[0]=0;
    for(auto [u, w] : adj[x]) {
        if(cen[u]) continue;
        dfs2(u, x, 1, w);
        for(auto [cnt, t] : tmp) {
            if(mp.find(t)==mp.end()) {
                mp[t]=cnt;
            } else {
                mp[t]=min(mp[t], cnt);
            }
        }
        tmp.clear();
    }
    mp.clear();
    cen[x]=1;
    for(auto [u, w] : adj[x]) {
        if(cen[u]) continue;
        cd(u, x);
    }
}
int best_path(int N, int K, int H[][2], int L[]) {
    n=N, k=K;
    for(int i=0; i<N-1; i++) {
        h[i][0]=H[i][0];
        h[i][1]=H[i][1];
        l[i]=L[i];
        adj[H[i][0]].push_back({H[i][1], L[i]});
        adj[H[i][1]].push_back({H[i][0], L[i]});
    }
    cd(0, -1);
    if(ans==2e9) return -1;
    else return ans;
}
#ifdef debug
int main() {
    ios::sync_with_stdio(0); cin.tie(0); 
    cin>>n>>k;
    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);
    return 0;
}
#endif
//rating below 2700 must be solved orzorzorz    
//4:30
Compilation message (stderr)
race.cpp: In function 'void usaco(std::string)':
race.cpp:21:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   21 |     freopen((s+".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
race.cpp:22:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   22 |     freopen((s+".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |