#include <bits/stdc++.h>
using namespace std;
typedef struct {
  long long int b, c;
} No;
vector<int> grafo[100100];
No arv[4 * 100100];
int pos[100100];
pair<int, int> axpos[100100];
long long int custo[100100];
long long int subida[100100];
long long int biscoito[100100];
long long int n, t;
void atualiza(int no, int i, int j, int posicao, long long int bisc,
              long long int cust) {
  if (i == j) {
    arv[no].c += cust;
    arv[no].b += bisc;
  } else {
    int esq = no * 2;
    int dir = no * 2 + 1;
    int meio = (i + j) / 2;
    arv[no].b += bisc;
    arv[no].c += cust * abs(bisc);
    if (posicao <= meio)
      atualiza(esq, i, meio, posicao, bisc, cust);
    else
      atualiza(dir, meio + 1, j, posicao, bisc, cust);
  }
}
long long int consulta(int no, int i, int j, long long int tempo) {
  if (arv[no].b <= 0 || tempo <= 0) return 0;
  if (i == j) {
    return min(tempo / arv[no].c, arv[no].b);
  } else {
    if (tempo >= arv[no].c) return arv[no].b;
    int esq = 2 * no;
    int dir = 2 * no + 1;
    int meio = (i + j) / 2;
    long long int res = consulta(esq, i, meio, tempo);
    long long int w = arv[esq].c;
    if (meio == i) w *= arv[esq].b;
    res += consulta(dir, meio + 1, j, tempo - w);
    return res;
  }
}
long long int dfs(int v, long long int tempo) {
  if (tempo <= 0) return 0;
  long long int fica, m1 = 0, m2 = 0, ax;
  atualiza(1, 1, n, pos[v], biscoito[v], custo[v]);
  fica = consulta(1, 1, n, tempo);
  for (int i = 0; i < (int)grafo[v].size(); i++) {
    int u = grafo[v][i];
    ax = dfs(u, tempo - subida[u] * 2);
    if (ax > m1) {
      m2 = m1;
      m1 = ax;
    } else if (ax > m2) {
      m2 = ax;
    }
  }
  atualiza(1, 1, n, pos[v], -biscoito[v], -custo[v]);
  if (v == 1) return max(fica, m1);
  return max(m2, fica);
}
int main() {
  int i;
  cin >> n >> t;
  for (i = 1; i <= n; i++) {
    cin >> biscoito[i];
  }
  for (i = 1; i <= n; i++) {
    cin >> custo[i];
    axpos[i].second = i;
    axpos[i].first = custo[i];
  }
  sort(axpos + 1, axpos + 1 + n);
  for (i = 1; i <= n; i++) {
    pos[axpos[i].second] = i;
  }
  int pai;
  for (i = 2; i <= n; i++) {
    cin >> pai >> subida[i];
    grafo[pai].push_back(i);
  }
  cout << dfs(1, t) << endl;
}
