#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll NEG = -(1LL << 60);
ll dp[2005][2005];
ll solve_fast(
int n,
int k,
int m,
vector<ll> &val,
vector<int> &cost
) {
for (int i = 0; i <= k; i++) {
for (int j = 0; j <= m; j++) {
dp[i][j] = NEG;
}
}
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int take = min(i - 1, k - 1); take >= 0; take--) {
for (int w = m - cost[i]; w >= 0; w--) {
if (dp[take][w] == NEG) continue;
dp[take + 1][w + cost[i]] =
max(
dp[take + 1][w + cost[i]],
dp[take][w] + val[i]
);
}
}
}
ll ans = NEG;
for (int w = 0; w <= m; w++) {
ans = max(ans, dp[k][w]);
}
return ans;
}
struct Res {
int sz;
vector<ll> dp;
};
int n, k, m;
vector<ll> a, c;
vector<vector<int>> g;
Res dfs(int u, int p) {
Res cur;
cur.sz = 1;
cur.dp.assign(2 * (m + 1), NEG);
if (c[u] <= m) {
cur.dp[(m + 1) + c[u]] = a[u];
}
for (int v : g[u]) {
if (v == p) continue;
Res child = dfs(v, u);
int new_sz = min(k, cur.sz + child.sz);
vector<ll> ndp(
(new_sz + 1) * (m + 1),
NEG
);
for (int i = 1; i <= cur.sz; i++) {
for (int w = 0; w <= m; w++) {
ndp[i * (m + 1) + w] =
max(
ndp[i * (m + 1) + w],
cur.dp[i * (m + 1) + w]
);
}
}
for (int i = 1; i <= cur.sz; i++) {
for (int w1 = 0; w1 <= m; w1++) {
ll val1 = cur.dp[i * (m + 1) + w1];
if (val1 == NEG) continue;
for (int j = 1; j <= child.sz && i + j <= new_sz; j++) {
for (int w2 = 0; w1 + w2 <= m; w2++) {
ll val2 =
child.dp[j * (m + 1) + w2];
if (val2 == NEG) continue;
ndp[(i + j) * (m + 1) + w1 + w2] =
max(
ndp[(i + j) * (m + 1) + w1 + w2],
val1 + val2
);
}
}
}
}
cur.sz = new_sz;
cur.dp.swap(ndp);
}
return cur;
}
ll solve_tree() {
Res root = dfs(1, 0);
ll ans = NEG;
if (root.sz >= k) {
for (int w = 0; w <= m; w++) {
ans = max(
ans,
root.dp[k * (m + 1) + w]
);
}
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k >> m;
vector<ll> val(n + 1);
vector<int> cost(n + 1);
for (int i = 1; i <= n; i++) {
cin >> val[i];
}
for (int i = 1; i <= n; i++) {
cin >> cost[i];
}
vector<pair<int, int>> edges;
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
edges.push_back({u, v});
}
ll ans;
if (n >= 300 && k >= 300 && m >= 300) {
ans = solve_fast(
n,
k,
m,
val,
cost
);
} else {
a.assign(n + 1, 0);
c.assign(n + 1, 0);
g.assign(n + 1, vector<int>());
for (int i = 1; i <= n; i++) {
a[i] = val[i];
c[i] = cost[i];
}
for (auto &e : edges) {
g[e.first].push_back(e.second);
g[e.second].push_back(e.first);
}
ans = solve_tree();
}
cout << (ans == NEG ? -1 : ans) << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKCmNvbnN0IGxsIE5FRyA9IC0oMUxMIDw8IDYwKTsKCmxsIGRwWzIwMDVdWzIwMDVdOwoKbGwgc29sdmVfZmFzdCgKICAgIGludCBuLAogICAgaW50IGssCiAgICBpbnQgbSwKICAgIHZlY3RvcjxsbD4gJnZhbCwKICAgIHZlY3RvcjxpbnQ+ICZjb3N0CikgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gazsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPD0gbTsgaisrKSB7CiAgICAgICAgICAgIGRwW2ldW2pdID0gTkVHOwogICAgICAgIH0KICAgIH0KCiAgICBkcFswXVswXSA9IDA7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgdGFrZSA9IG1pbihpIC0gMSwgayAtIDEpOyB0YWtlID49IDA7IHRha2UtLSkgewogICAgICAgICAgICBmb3IgKGludCB3ID0gbSAtIGNvc3RbaV07IHcgPj0gMDsgdy0tKSB7CiAgICAgICAgICAgICAgICBpZiAoZHBbdGFrZV1bd10gPT0gTkVHKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICBkcFt0YWtlICsgMV1bdyArIGNvc3RbaV1dID0KICAgICAgICAgICAgICAgICAgICBtYXgoCiAgICAgICAgICAgICAgICAgICAgICAgIGRwW3Rha2UgKyAxXVt3ICsgY29zdFtpXV0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRwW3Rha2VdW3ddICsgdmFsW2ldCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsbCBhbnMgPSBORUc7CgogICAgZm9yIChpbnQgdyA9IDA7IHcgPD0gbTsgdysrKSB7CiAgICAgICAgYW5zID0gbWF4KGFucywgZHBba11bd10pOwogICAgfQoKICAgIHJldHVybiBhbnM7Cn0KCnN0cnVjdCBSZXMgewogICAgaW50IHN6OwogICAgdmVjdG9yPGxsPiBkcDsKfTsKCmludCBuLCBrLCBtOwp2ZWN0b3I8bGw+IGEsIGM7CnZlY3Rvcjx2ZWN0b3I8aW50Pj4gZzsKClJlcyBkZnMoaW50IHUsIGludCBwKSB7CiAgICBSZXMgY3VyOwoKICAgIGN1ci5zeiA9IDE7CiAgICBjdXIuZHAuYXNzaWduKDIgKiAobSArIDEpLCBORUcpOwoKICAgIGlmIChjW3VdIDw9IG0pIHsKICAgICAgICBjdXIuZHBbKG0gKyAxKSArIGNbdV1dID0gYVt1XTsKICAgIH0KCiAgICBmb3IgKGludCB2IDogZ1t1XSkgewogICAgICAgIGlmICh2ID09IHApIGNvbnRpbnVlOwoKICAgICAgICBSZXMgY2hpbGQgPSBkZnModiwgdSk7CgogICAgICAgIGludCBuZXdfc3ogPSBtaW4oaywgY3VyLnN6ICsgY2hpbGQuc3opOwoKICAgICAgICB2ZWN0b3I8bGw+IG5kcCgKICAgICAgICAgICAgKG5ld19zeiArIDEpICogKG0gKyAxKSwKICAgICAgICAgICAgTkVHCiAgICAgICAgKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gY3VyLnN6OyBpKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgdyA9IDA7IHcgPD0gbTsgdysrKSB7CiAgICAgICAgICAgICAgICBuZHBbaSAqIChtICsgMSkgKyB3XSA9CiAgICAgICAgICAgICAgICAgICAgbWF4KAogICAgICAgICAgICAgICAgICAgICAgICBuZHBbaSAqIChtICsgMSkgKyB3XSwKICAgICAgICAgICAgICAgICAgICAgICAgY3VyLmRwW2kgKiAobSArIDEpICsgd10KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBjdXIuc3o7IGkrKykgewogICAgICAgICAgICBmb3IgKGludCB3MSA9IDA7IHcxIDw9IG07IHcxKyspIHsKCiAgICAgICAgICAgICAgICBsbCB2YWwxID0gY3VyLmRwW2kgKiAobSArIDEpICsgdzFdOwoKICAgICAgICAgICAgICAgIGlmICh2YWwxID09IE5FRykgY29udGludWU7CgogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gY2hpbGQuc3ogJiYgaSArIGogPD0gbmV3X3N6OyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB3MiA9IDA7IHcxICsgdzIgPD0gbTsgdzIrKykgewoKICAgICAgICAgICAgICAgICAgICAgICAgbGwgdmFsMiA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5kcFtqICogKG0gKyAxKSArIHcyXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwyID09IE5FRykgY29udGludWU7CgogICAgICAgICAgICAgICAgICAgICAgICBuZHBbKGkgKyBqKSAqIChtICsgMSkgKyB3MSArIHcyXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRwWyhpICsgaikgKiAobSArIDEpICsgdzEgKyB3Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsMSArIHZhbDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjdXIuc3ogPSBuZXdfc3o7CiAgICAgICAgY3VyLmRwLnN3YXAobmRwKTsKICAgIH0KCiAgICByZXR1cm4gY3VyOwp9CgpsbCBzb2x2ZV90cmVlKCkgewogICAgUmVzIHJvb3QgPSBkZnMoMSwgMCk7CgogICAgbGwgYW5zID0gTkVHOwoKICAgIGlmIChyb290LnN6ID49IGspIHsKICAgICAgICBmb3IgKGludCB3ID0gMDsgdyA8PSBtOyB3KyspIHsKICAgICAgICAgICAgYW5zID0gbWF4KAogICAgICAgICAgICAgICAgYW5zLAogICAgICAgICAgICAgICAgcm9vdC5kcFtrICogKG0gKyAxKSArIHddCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBhbnM7Cn0KCmludCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBjaW4gPj4gbiA+PiBrID4+IG07CgogICAgdmVjdG9yPGxsPiB2YWwobiArIDEpOwogICAgdmVjdG9yPGludD4gY29zdChuICsgMSk7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgY2luID4+IHZhbFtpXTsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICBjaW4gPj4gY29zdFtpXTsKICAgIH0KCiAgICB2ZWN0b3I8cGFpcjxpbnQsIGludD4+IGVkZ2VzOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaW50IHUsIHY7CiAgICAgICAgY2luID4+IHUgPj4gdjsKCiAgICAgICAgZWRnZXMucHVzaF9iYWNrKHt1LCB2fSk7CiAgICB9CgogICAgbGwgYW5zOwoKICAgIGlmIChuID49IDMwMCAmJiBrID49IDMwMCAmJiBtID49IDMwMCkgewogICAgICAgIGFucyA9IHNvbHZlX2Zhc3QoCiAgICAgICAgICAgIG4sCiAgICAgICAgICAgIGssCiAgICAgICAgICAgIG0sCiAgICAgICAgICAgIHZhbCwKICAgICAgICAgICAgY29zdAogICAgICAgICk7CiAgICB9IGVsc2UgewogICAgICAgIGEuYXNzaWduKG4gKyAxLCAwKTsKICAgICAgICBjLmFzc2lnbihuICsgMSwgMCk7CiAgICAgICAgZy5hc3NpZ24obiArIDEsIHZlY3RvcjxpbnQ+KCkpOwoKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgYVtpXSA9IHZhbFtpXTsKICAgICAgICAgICAgY1tpXSA9IGNvc3RbaV07CiAgICAgICAgfQoKICAgICAgICBmb3IgKGF1dG8gJmUgOiBlZGdlcykgewogICAgICAgICAgICBnW2UuZmlyc3RdLnB1c2hfYmFjayhlLnNlY29uZCk7CiAgICAgICAgICAgIGdbZS5zZWNvbmRdLnB1c2hfYmFjayhlLmZpcnN0KTsKICAgICAgICB9CgogICAgICAgIGFucyA9IHNvbHZlX3RyZWUoKTsKICAgIH0KCiAgICBjb3V0IDw8IChhbnMgPT0gTkVHID8gLTEgOiBhbnMpIDw8ICdcbic7CgogICAgcmV0dXJuIDA7Cn0K