#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct param{
    int v,d,l,c;
    int rank;
};

// ツ残ツづィツ氾ッツ用ツづ古卍つヲツづゥツ催仰ュツδニツッツト
param dp[301][301];
int n,m;
vector<param> bydol;

param dfs(int idx,int money){
    if(idx==n){
        param p;
        p.v=p.d=p.l=0;
        return p;
    }
    if(dp[idx][money].rank!=-1)
        return dp[idx][money];
    param res;
    res.d=res.l=res.v=0;
    // ツつアツつアツづ可スツ妥篠古卍つ、ツつゥ
    for(int i = 0; ;i++){
        if(i*bydol[idx].c>money)
            break;
        param p=dfs(idx+1,money-i*bydol[idx].c);
        // ツ催妥・ツ値ツづーツ更ツ新
        res.d=max(res.d,p.d+i*bydol[idx].d);
        res.l=max(res.l,p.l+i*bydol[idx].l);
        res.v=max(res.v,p.v+i*bydol[idx].v);
    }
    dp[idx][money]=res;
    dp[idx][money].rank=max(max(res.d,res.l),res.v);
    return dp[idx][money];
}

int main(){
    while(cin>>n>>m){
        bydol.clear();
        for(int i = 0; i < 301; i++)
            for(int j = 0; j < 301; j++)
                dp[i][j].rank=-1;
        int minC=100000;
        for(int i = 0; i < n; i++){
            string name;
            getline(cin,name);
            getline(cin,name);
            int c,v,d,l;
            cin>>c>>v>>d>>l;
            minC=min(minC,c);
            param p;
            p.c=c;p.v=v;p.l=l;p.d=d;
            bydol.push_back(p);
        }
        if(minC>m){
            cout<<0<<endl;
            continue;
        }
        param p=dfs(0,m);
        cout<<p.rank<<endl;
    }
    return 0;
}