/*
基础多重背包题
比较有价值的就 “ 二分制压缩 ” 了,将每个个数长度num压缩成log(num)
*/
#include <cstdio>
#include <cstring>
struct One
{
int v;
int c;
};
One peo[100001];
int hash[15][15];
int dp[100005];
int max( int a, int b)
{
return a > b ? a : b;
}
int main()
{
int i,j,n,c,num;
int temp_val,temp_col,count,sum,temp_sum;
char s[50];
while( scanf(" %d %d", &n ,&c) != EOF)
{
num=0;
memset( hash, 0, sizeof( hash));
memset( dp, 0, sizeof( dp));
for ( i = 0; i < n; i++)
{
scanf( "%s%d%d", s, &temp_val, &temp_col);
if(hash[temp_val][temp_col] == 0)
{
peo[num].v = temp_val;
peo[num].c = temp_col;
num++;
}
hash[temp_val][temp_col] ++;
}
for( i = 0; i < num; i++)
{
count=1;
sum=0;
temp_sum = hash[peo[i].v][peo[i].c];
while(sum < temp_sum)
{
for( j = c; j - count * peo[i].c >= 0; j--)
{
dp[j] = max (dp[j] , dp[j - count * peo[i].c] + count * peo[i].v);
}
sum += count;
if(temp_sum - sum < count * 2)
count = temp_sum - sum;
else
count *= 2;
}
}
printf("%d\n", dp[c]);
}
return 0;
}