#include<stdio.h>
int dynamic(int[][2], int, int, int, int);
int main(void)
{
	int f1, f2, N, M, C, P, temp = 0, dp[301][2], out;
	char name[31];
	while(scanf("%d %d",&N, &M) != EOF){
		out = 0;
		for(f1 = 0; f1 < 2; f1++){
			for(f2 = 0; f2 <= M; f2++){
				dp[f2][f1] = 0;
			}
		}
		for(f1 = 0; f1 < N; f1++){
			temp = 0;
			fflush(stdin);
			gets(name);
			fflush(stdin);
			scanf("%d",&C);
			for(f2 = 0; f2 < 3; f2++){
				scanf("%d",&P);
				if(temp < P)
					temp = P;
			}
			temp = dynamic(dp, f1 % 2, C, temp, M);
			if(temp > out)
				out = temp;
		}
		printf("%d\n",out);
	}
	return 0;
}
int dynamic(int dp[][2], int flag, int cost, int rank, int M){
	int f1, cnt = 1, temp, max = 0;
	for(f1 = 0; f1 <= M; f1++){
		dp[f1][flag] = 0;
	}
	while(cnt * cost <= M){
		temp = rank * cnt;
		for(f1 = 0; f1 <= M - cnt * cost; f1++){
			if(dp[f1][!flag] + temp > dp[f1 + cnt * cost][flag])
				dp[f1 + cnt * cost][flag] = dp[f1][!flag] + temp;
			else
				dp[f1][flag] = dp[f1][flag];
		}
		cnt++;
	}
	for(f1 = 0; f1 <= M; f1++){ 
		if(dp[f1][flag] > max)
			max = dp[f1][flag];
	}
	return max;
}