#include <bits/stdc++.h>
using namespace std;
int h[5005], ne[5005], to[5005], en = 0;
unsigned int dp[5005][5005][2], tmp[5005][2];
int n, b, c[5005], d[5005], siz[5005];
void add(int a, int b) {
  to[en] = b;
  ne[en] = h[a];
  h[a] = en++;
}
void Tree_DP(int o) {
  for (int i = 0; i <= n; ++i) dp[o][i][0] = dp[o][i][1] = 2100000000;
  dp[o][1][1] = c[o] - d[o];
  dp[o][1][0] = c[o];
  dp[o][0][0] = 0;
  siz[o] = 1;
  for (int i = h[o]; i >= 0; i = ne[i]) {
    Tree_DP(to[i]);
    for (int j = 0; j <= siz[o] + siz[to[i]]; ++j)
      tmp[j][0] = tmp[j][1] = 2100000000;
    for (int j = 0; j <= siz[o]; ++j)
      for (int k = 0; k <= siz[to[i]]; ++k) {
        if (dp[o][j][0] < 2100000000 && dp[to[i]][k][0] < 2100000000)
          tmp[j + k][0] =
              min((long long)tmp[j + k][0],
                  (long long)dp[o][j][0] + (long long)dp[to[i]][k][0]);
        if (dp[o][j][1] < 2100000000 && dp[to[i]][k][1] < 2100000000)
          tmp[j + k][1] = min((long long)tmp[j + k][1],
                              (long long)dp[o][j][1] + dp[to[i]][k][1]);
        if (dp[o][j][1] < 2100000000 && dp[to[i]][k][0] < 2100000000)
          tmp[j + k][1] = min((long long)tmp[j + k][1],
                              (long long)dp[o][j][1] + dp[to[i]][k][0]);
      }
    for (int j = 0; j <= siz[o] + siz[to[i]]; ++j) {
      dp[o][j][0] = tmp[j][0];
      dp[o][j][1] = tmp[j][1];
    }
    siz[o] += siz[to[i]];
  }
  return;
}
int main() {
  memset(h, -1, sizeof h);
  scanf("%d%d", &n, &b);
  for (int i = 1; i <= n; ++i) {
    scanf("%d%d", &c[i], &d[i]);
    int x;
    if (i != 1) {
      scanf("%d", &x);
      add(x, i);
    }
  }
  Tree_DP(1);
  int ans = 0;
  for (int i = n; i >= 0; --i)
    if (min(dp[1][i][0], dp[1][i][1]) <= (unsigned int)b) ans = max(ans, i);
  printf("%d\n", ans);
}
