#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define N 100005
using namespace std;
int n,g,c[N],val[N],dp[505][10005];
vector<int>edge[N];
void dfs(int u,int vol)
{
int i,len=edge[u].size(),v,j;
for(i=0;i<len;i++){
v=edge[u][i];
if(edge[v].empty()) {
for(j=vol;j>=c[v];j--){
dp[u][j]=max(dp[u][j],dp[u][j-c[v]]+val[v]);
}
}
else{
for(j=vol-c[v];j>=0;j--) dp[v][j]=dp[u][j];
dfs(v,vol-c[v]);
for(j=vol;j>=c[v];j--) dp[u][j]=max(dp[u][j],dp[v][j-c[v]]+val[v]);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&g)){
int i,f;
memset(dp,0,sizeof(dp));
for(i=0;i<=n;i++) edge[i].clear();
for(i=1;i<=n;i++){
scanf("%d%d%d",c+i,val+i,&f);
if(f==i) edge[0].push_back(i);
else edge[f].push_back(i);
}
dfs(0,g);
printf("%d\n",dp[0][g]);
}
return 0;
}