#include <algorithm>
#include <cmath>
#include <iostream>
#include <queue>
#include <set>
#include <string>
#include <vector>
#include <map>
typedef long long ll;
using namespace std;
vector<vector<pair<int, ll>>> adj;
void dfs(int u, int p, vector<ll> &dist) {
for (auto &e : adj[u]) {
int v = e.first;
ll w = e.second;
if (v == p) continue;
dist[v] = dist[u] + w;
dfs(v, u, dist);
}
}
int max_score(int n, int x, int y, ll k, vector<int> U, vector<int> V, vector<int> W) {
adj.assign(n, {});
vector<ll> distX(n, 0), distY(n, 0);
for (int i = 0; i < n - 1; ++i) {
int u = U[i], v = V[i];
ll w = W[i];
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
if (x > y) swap(x, y);
dfs(x, -1, distX);
dfs(y, -1, distY);
vector<ll> dist(n);
for (int i = 0; i < n; ++i) dist[i] = min(distX[i], distY[i]);
for (int i = 0; i < n; ++i) dist[i] = min(distX[i], distY[i]);
sort(dist.begin(), dist.end());
int score = 0;
for (int i = 0; i < n; ++i) {
if (k < dist[i]) break;
k -= dist[i];
score++;
}
return score;
}