#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N = 110;
int f[N][N],w[N],root,n,V,v[N];
int e[N << 1],ne[N << 1],h[N << 1],idx;
void add(int a,int b)
{
e[idx] = b,ne[idx] = h[a],h[a] = idx ++;
}
void dfs(int u)
{
for(int i = h[u];i != -1;i = ne[i])
{
int son = e[i];
dfs(son);
for(int j = V - v[u];j >= 0;j --)
for(int k = 0;k <= j;k ++)
{
f[u][j] = max(f[u][j],f[u][j - k] + f[son][k]);
}
}
for(int j = V;j >= v[u];j --) f[u][j] = f[u][j-v[u]] + w[u];
for(int j = 1;j < v[u];j ++) f[u][j] = 0;
}
int main()
{
cin >> n >> V;
memset(h,-1,sizeof h);
for(int i = 1;i <= n;i ++)
{
int p;
cin >> v[i] >> w[i] >> p;
if(p == -1) root = i;
else add(p,i);
}
dfs(root);
cout << f[root][V] << endl;
return 0;
}