#include <bits/stdc++.h>
using namespace std;
const long long N = 1e6 + 100, M = 4e6 + 10;
long long n, T;
long long a[N], t[N], ans[N];
vector<pair<long long, long long> > g[N];
long long rt;
struct T {
  long long sum[M], num[M];
  long long lc[M], rc[M];
  long long tot;
  void update(long long &c, long long l, long long r, long long pos,
              long long w) {
    if (!c) c = ++tot;
    if (l == r) {
      num[c] += w;
      sum[c] += w * pos;
      return;
    }
    long long mid = l + r >> 1;
    if (pos <= mid)
      update(lc[c], l, mid, pos, w);
    else
      update(rc[c], mid + 1, r, pos, w);
    sum[c] = sum[lc[c]] + sum[rc[c]];
    num[c] = num[lc[c]] + num[rc[c]];
  }
  long long query(long long c, long long l, long long r, long long w) {
    if (!c) return 0;
    if (sum[c] <= w) return num[c];
    if (l == r) return w / l;
    long long mid = l + r >> 1;
    if (sum[lc[c]] < w)
      return num[lc[c]] + query(rc[c], mid + 1, r, w - sum[lc[c]]);
    else
      return query(lc[c], l, mid, w);
  }
} b;
long long mx[N][2];
void dfs(long long u, long long c) {
  if (c <= 0) return;
  b.update(rt, 1, 1e6, t[u], a[u]);
  ans[u] = b.query(rt, 1, 1e6, c);
  for (auto [to, w] : g[u]) {
    dfs(to, c - 2 * w);
    long long s = ans[to];
    if (s >= mx[u][0])
      mx[u][1] = mx[u][0], mx[u][0] = s;
    else
      mx[u][1] = max(s, mx[u][1]);
  }
  if (u == 1)
    ans[u] = max(ans[u], mx[u][0]);
  else {
    ans[u] = max(ans[u], mx[u][1]);
  }
  b.update(rt, 1, 1e6, t[u], -a[u]);
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> T;
  for (long long i = 1; i <= n; i++) cin >> a[i];
  for (long long i = 1; i <= n; i++) cin >> t[i];
  for (long long i = 2; i <= n; i++) {
    long long x, y;
    cin >> x >> y;
    g[x].push_back({i, y});
  }
  dfs(1, T);
  cout << ans[1] << '\n';
}
