#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5050;
int N, B, C[MAXN], D[MAXN], P[MAXN], s[MAXN];
long long dp[MAXN][MAXN], ks[MAXN];
vector<int> child[MAXN], adjList[MAXN];
int main() {
  scanf("%d%d", &N, &B);
  for (int i = 0; i < N; ++i) {
    scanf("%d%d", &C[i], &D[i]);
    if (i) {
      scanf("%d", &P[i]);
      --P[i];
      adjList[P[i]].push_back(i);
    } else
      P[i] = -1;
  }
  memset(dp, -1, sizeof dp);
  for (int x = N - 1; x >= 0; --x) {
    child[x].push_back(C[x]);
    for (auto it : adjList[x]) {
      for (auto k : child[it]) child[x].push_back(k);
    }
    sort(child[x].begin(), child[x].end());
    s[x] = child[x].size();
    dp[x][0] = 0;
    for (int i = 1; i <= s[x]; ++i) dp[x][i] = dp[x][i - 1] + child[x][i - 1];
    ks[0] = 0;
    ks[1] = C[x] - D[x];
    for (int i = 2; i <= s[x]; ++i) ks[i] = -1;
    int sum = 1;
    for (auto it : adjList[x]) {
      sum += s[it];
      for (int v = sum; v > 1; --v) {
        for (int k = min(v - 1, s[it]); k > 0; --k) {
          if (ks[v - k] == -1) break;
          if (ks[v] == -1 || ks[v] > ks[v - k] + dp[it][k])
            ks[v] = ks[v - k] + dp[it][k];
        }
      }
    }
    for (int v = s[x]; v >= 0; --v) {
      dp[x][v] = min(dp[x][v], ks[v]);
      if (v < s[x]) {
        dp[x][v] = min(dp[x][v + 1], dp[x][v]);
      }
    }
  }
  int ans = 0;
  for (int i = 0; i <= N; ++i) {
    if (dp[0][i] <= B) ans = i;
  }
  printf("%d\n", ans);
}
