#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e6 + 5;
struct Edge {
  int v;
  long long w;
};
long long x[MAX_N], t[MAX_N];
vector<Edge> g[MAX_N];
long long sum[MAX_N << 2], cnt[MAX_N << 2];
void update(int pos, int l, int r, long long xi, long long ti) {
  sum[pos] += xi * ti;
  cnt[pos] += xi;
  if (l == r) return;
  int mid = (l + r) >> 1;
  if (ti <= mid)
    update((pos << 1), l, mid, xi, ti);
  else
    update((pos << 1 | 1), mid + 1, r, xi, ti);
}
long long query(int pos, int l, int r, long long val) {
  if (l == r) return min(cnt[pos], val / l);
  int mid = (l + r) >> 1;
  if (sum[(pos << 1)] <= val)
    return cnt[(pos << 1)] +
           query((pos << 1 | 1), mid + 1, r, val - sum[(pos << 1)]);
  else
    return query((pos << 1), l, mid, val);
}
long long dfs(int u, long long res) {
  update(1, 1, 1e6, x[u], t[u]);
  long long ans = query(1, 1, 1e6, res);
  long long f1 = 0, f2 = 0;
  for (const auto &tmp : g[u]) {
    int v = tmp.v;
    long long w = tmp.w;
    if (res < 2 * w) continue;
    long long f = dfs(v, res - 2 * w);
    if (f > f1)
      f2 = f1, f1 = f;
    else if (f > f2)
      f2 = f;
  }
  update(1, 1, 1e6, -x[u], t[u]);
  if (u == 1)
    return max(ans, f1);
  else
    return max(ans, f2);
}
int main() {
  std::ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  long long T;
  cin >> n >> T;
  for (int i = 1; i <= n; i++) cin >> x[i];
  for (int i = 1; i <= n; i++) cin >> t[i];
  for (int u = 2; u <= n; u++) {
    int v;
    long long w;
    cin >> v >> w;
    g[v].push_back((Edge){u, w});
  }
  long long ans = dfs(1, T);
  cout << ans << endl;
  return 0;
}
