#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 7;
int n;
vector<int> g[5005];
int c[5005];
int d[5005];
vector<int> node;
int sub[5005];
int dp[2][5005];
int ans[5005][5005];
bool cmp(int x, int y) { return c[x] < c[y]; }
bool vis[5005];
void go(int x) {
  vis[x] = true;
  for (auto i : g[x]) {
    go(i);
  }
}
void compute(int x) {
  memset(vis, false, sizeof vis);
  go(x);
  int sum = 0;
  int id = 0;
  for (auto i : node) {
    if (vis[i] == true) {
      sum += c[i];
      if (sum >= inf) sum = inf;
      ans[x][++id] = sum;
    }
  }
}
void dfs(int x) {
  sub[x] = 1;
  for (auto i : g[x]) {
    dfs(i);
    sub[x] += sub[i];
  }
  int sz = g[x].size();
  for (int j = 1; j <= sub[x]; j++) {
    dp[0][j] = inf;
  }
  dp[0][0] = 0;
  int ro = 0;
  int opt = 0;
  for (int i = 1; i <= sz; i++) {
    ro ^= 1;
    int u = g[x][i - 1];
    dp[ro][0] = 0;
    opt += sub[u];
    for (int j = 1; j <= opt; j++) {
      dp[ro][j] = inf;
      for (int k = min(j, sub[u]); k >= 0; k--) {
        if ((j - k) > opt - sub[u]) break;
        dp[ro][j] = min(dp[ro][j], dp[ro ^ 1][j - k] + ans[u][k]);
        if (dp[ro][j] >= inf) dp[ro][j] = inf;
      }
    }
  }
  ans[x][0] = 0;
  for (int i = 1; i <= sub[x]; i++) {
    ans[x][i] = min(ans[x][i], dp[ro][i - 1] + (c[x] - d[x]));
    if (ans[x][i] >= inf) ans[x][i] = inf;
  }
}
int main(int argc, char const *argv[]) {
  int b;
  scanf("%d %d", &n, &b);
  for (int i = 1; i <= n; i++) {
    int p;
    if (i == 1) {
      scanf("%d %d", &c[i], &d[i]);
    } else {
      scanf("%d %d %d", &c[i], &d[i], &p);
      g[p].push_back(i);
    }
  }
  for (int i = 1; i <= n; i++) {
    node.push_back(i);
  }
  sort(node.begin(), node.end(), cmp);
  for (int i = 1; i <= n; i++) {
    compute(i);
  }
  dfs(1);
  int res = 0;
  for (int i = 0; i <= n; i++) {
    if (ans[1][i] <= b) {
      res = i;
    }
  }
  printf("%d\n", res);
  return 0;
}
