#include <bits/stdc++.h>
using namespace std;
const int N = 5000 + 20;
const int oo = 1e9 + 20;
const int MOD = 1e9 + 7;
vector<vector<int>> g;
int bro[N], son[N], cnt[N], c[N], d[N];
int dp[N][N][2];
bool ready[N][N][2];
int dfs(int u) {
  if (u == 0) return 0;
  cnt[u] += dfs(bro[u]);
  cnt[u] += dfs(son[u]);
  return ++cnt[u];
}
int go(int u, int k, bool can) {
  if (k > cnt[u]) return oo;
  if (k == 0) return 0;
  int &r = dp[u][k][can];
  if (ready[u][k][can]) return r;
  ready[u][k][can] = 1;
  r = oo;
  bool swapped = false;
  int lim = min(k, min(cnt[bro[u]], 1 + cnt[son[u]]));
  if (cnt[bro[u]] > 1 + cnt[son[u]]) swapped = 1;
  for (int i = 0; i <= lim; i++) {
    int am_son = k - i;
    int am_bro = i;
    if (swapped) swap(am_bro, am_son);
    int right = go(bro[u], am_bro, can);
    int down = 0;
    if (am_son)
      down = min(go(son[u], am_son, 0),
                 go(son[u], am_son - 1, can) + c[u] - (can ? d[u] : 0));
    r = min(r, right + down);
  }
  return r;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, b;
  while (cin >> n >> b) {
    g.assign(n + 1, {});
    for (int i = 1; i <= n; i++) {
      cin >> c[i] >> d[i];
      if (i > 1) {
        int pi;
        cin >> pi;
        g[pi].push_back(i);
      }
    }
    for (int i = 1; i <= n; i++) {
      if (g[i].size()) son[i] = g[i][0];
      for (int j = 1; j < (int)g[i].size(); j++) {
        bro[g[i][j - 1]] = g[i][j];
      }
    }
    dfs(1);
    int ans = 0;
    while (ans <= n && go(1, ans, 1) <= b) ans++;
    cout << ans - 1 << '\n';
  }
}
