#include <bits/stdc++.h>
using namespace std;
#define int int64_t
#define all(v) (v).begin(), (v).end()
#define sz(v) (int)(v).size()
#define PI 3.14159265358979323846264
template<typename T>
using vec = vector<T>;
mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
int n, k;
int tpt = 123123123;
constexpr int N = 2e5;
vec<pair<int, int>> ke[N + 5];
bool removed[N + 5];
int subtree[N + 5];
int getsub(int u, int p) {
subtree[u] = 1;
for (auto& fpt : ke[u]) {
int v = fpt.first;
int w = fpt.second;
if (v == p || removed[v]) continue;
subtree[u] += getsub(v, u);
}
return subtree[u];
}
int getCentroid(int u, int p, int total) {
for (auto& fpt : ke[u]) {
int v = fpt.first;
int w = fpt.second;
if (v == p || removed[v]) continue;
if (subtree[v] * 2 > total) {
getCentroid(v, u, total);
}
}
return u;
}
void Dfs(int u, int p, vec<pair<int, int>>& node, int dep, int dist) {
node.push_back({dep, dist});
for (auto& fpt : ke[u]) {
int v = fpt.first;
int w = fpt.second;
if (!removed[v] && v != p) {
Dfs(v, u, node, dep + 1, dist + w);
}
}
}
void process(int cen) {
map<int, int> mp;
mp[0] = 0;
for (auto& fpt : ke[cen]) {
int v = fpt.first;
int w = fpt.second;
if (!removed[v]) {
vec<pair<int, int>> node;
Dfs(v, cen, node, 1, w);
for (auto& tft : node) {
int eg = tft.first;
int dis = tft.second;
if (mp.find(k - dis) != mp.end()) {
tpt = min(tpt, mp[k - dis] + eg);
}
}
for (auto& tft : node) {
int dis = tft.second;
int eg = tft.first;
mp[dis] = min(mp[dis], eg);
}
}
}
}
void decompose(int u) {
int total = getsub(u, -1);
int cen = getCentroid(u, -1, total);
process(cen);
removed[cen] = true;
for (auto& fpt : ke[cen]) {
int v = fpt.first;
int w = fpt.second;
if (removed[v]) continue;
decompose(v);
}
}
void solving(int tc) {
cin >> n >> k;
vec<pair<int, int>> edge;
vec<int> len;
for (int i = 0; i < n - 1; ++i) {
int u, v;
cin >> u >> v;
edge.push_back({u, v});
}
for (int i = 0; i < n - 1; ++i) {
int w;
cin >> w;
len.push_back(w);
}
for (int i = 0; i < n - 1; ++i) {
ke[edge[i].first].push_back({edge[i].second, len[i]});
ke[edge[i].second].push_back({edge[i].first, len[i]});
}
decompose(0);
if (tpt == 123123123) {
cout << -1 << "\n";
}
else {
cout << tpt << "\n";
}
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
if(fopen("TASK.in", "r")){
freopen("TASK.in", "r", stdin);
freopen("TASK.out", "w", stdout);
}
int testCase = 1;
while (testCase--) {
solving(testCase);
}
cerr << "\nTime elapsed: " << (1.0 * clock() / CLOCKS_PER_SEC) << ".s\n";
}