/*
  SEFI
*/

#include <set>
#include <vector>
#include <cstdio>
using namespace std;



const int N = 100009;
vector <int> g [ N ];
multiset <int> q[ N ];
int summa[N];

int udov [ N ];
int cost [ N ];

long long res = 0;
int m;
void add (int &v , int &u){
            multiset <int> &a = q[v];
            multiset <int> &b = q[u];
            if (a.size() < b.size())
              a.swap (b) , swap (summa[v] , summa[u]);

            for (multiset <int> ::iterator it = b.begin() ; it != b.end() ; ++it){
                      if (summa[v] + *it <= m)
                      a.insert (*it) , summa[v] += *it;
                      else {
                                if (!a.empty()&& *it < *(--a.end()))
                                            summa[v] -=*(--a.end()) ,
                                            summa[v] += *it ,
                                            a.erase ((--a.end())) , a.insert (*it);
                      }
            }
            b.clear();
}

int n ;

void dfs (int v , int p = 0){
      if (cost[v] + summa[v] <= m)
            q[v].insert (cost[v]) , summa[v] += cost[v];
      for (int i = 0 ; i < (int)g[v].size() ; ++i){
                  int to = g[v][i];
                  dfs (to , v);
                  add (v , to);
      }
      res = max (res , (int)q[v].size() * 1LL * udov[v]);
}

#define pb push_back

int main(){

  scanf ("%d%d" , &n , &m);
  for (int i = 1 ; i <= n ; ++i){
              int boss; scanf ("%d%d%d" , &boss , &cost[i] , &udov[i]);
              g[boss].pb(i);
  }
  dfs (1);
  printf ("%lld\n" , res);

  return 0;
}