#include <bits/stdc++.h>
namespace FASTIO {
const int LEN = 1 << 21;
char BUF[LEN], *Pin, *Pin_last, PUF[LEN], *Pout = PUF,
                                          *Pout_last = PUF + LEN - 1;
inline char Getchar() {
  return Pin == Pin_last && (Pin_last = (Pin = BUF) + fread(BUF, 1, LEN, stdin),
                             Pin == Pin_last)
             ? EOF
             : *Pin++;
}
inline void Putchar(const char x) {
  if (Pout == Pout_last) fwrite(PUF, 1, Pout - PUF, stdout), Pout = PUF;
  *Pout++ = x;
}
struct fastio_init {
  fastio_init() {}
  ~fastio_init() { fwrite(PUF, 1, Pout - PUF, stdout); }
} init_func;
template <typename T>
inline void wt(T x, char c = '\n') {
  if (x < 0) {
    x = -x;
    Putchar('-');
  }
  static char sta[sizeof(T) * 8];
  int top = 0;
  do {
    sta[top++] = x % 10;
    x /= 10;
  } while (x);
  while (top) Putchar(sta[--top] + '0');
  Putchar(c);
}
template <typename T>
inline T rd() {
  T sum = 0, fl = 1;
  char ch = Getchar();
  for (; ch < '0' || ch > '9'; ch = Getchar())
    if (ch == '-')
      fl = -1;
    else if (ch == EOF)
      exit(0);
  for (; '0' <= ch && ch <= '9'; ch = Getchar()) sum = sum * 10 + ch - '0';
  return sum * fl;
}
}  // namespace FASTIO
using namespace FASTIO;
int n, b, *c, *d, *size;
long long **f0, **f1;
std::vector<int>* G;
int Dfs_(const int x, const int fa) {
  size[x] = 1;
  for (auto&& son : G[x])
    if (son != fa) size[x] += Dfs_(son, x);
  return size[x];
}
int Dfs(const int x, const int fa) {
  f0[x] = new long long[size[x] + 1];
  f1[x] = new long long[size[x] + 1];
  memset(f0[x], 7, sizeof(**f0) * (size[x] + 1));
  memset(f1[x], 7, sizeof(**f0) * (size[x] + 1));
  f0[x][0] = 0;
  f0[x][1] = c[x];
  f1[x][1] = c[x] - d[x];
  int szx = 1;
  for (auto&& son : G[x])
    if (son != fa) {
      Dfs(son, x);
      for (int i = szx; i >= 0; i--)
        for (int j = 0; j <= size[son]; j++) {
          f0[x][i + j] = std::min(f0[x][i + j], f0[x][i] + f0[son][j]);
          f1[x][i + j] = std::min(f1[x][i + j], f1[x][i] + f1[son][j]);
          f1[x][i + j] = std::min(f1[x][i + j], f1[x][i] + f0[son][j]);
        }
      szx += size[son];
    }
  return size[x];
}
int main() {
  n = rd<int>();
  b = rd<int>();
  c = new int[n + 1];
  d = new int[n + 1];
  G = new std::vector<int>[n + 1];
  f0 = new long long*[n + 1];
  f1 = new long long*[n + 1];
  c[1] = rd<int>();
  d[1] = rd<int>();
  size = new int[n + 1]();
  for (int i = 2; i <= n; i++) {
    c[i] = rd<int>();
    d[i] = rd<int>();
    G[rd<int>()].push_back(i);
  }
  Dfs_(1, 0);
  Dfs(1, 0);
  for (int i = n;; i--)
    if (f1[1][i] <= b || f0[1][i] <= b) {
      wt(i);
      break;
    }
  return 0;
}
