#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()
const int mod=1000000007,MAX=50001;
const ll INF=1LL<<60;

int main(){

    int N;
    ll W;cin>>N>>W;
    
    ll ans=0;
    
    vector<ll> v(N),w(N),m(N);
    for(int i=0;i<N;i++){
        cin>>v[i]>>w[i]>>m[i];
    }
    
    vector<vector<ll>> dp(N+1,vector<ll>(50*N+1,INF));//価値iをつくる最小の重さ
    
    dp[0][0]=0;
    
    for(int i=1;i<=N;i++){
        for(int j=50*N;j>=0;j--){
            dp[i][j]=min(dp[i][j],dp[i-1][j]);
            if(j-v[i-1]>=0) dp[i][j]=min(dp[i][j],dp[i-1][j-v[i-1]]+w[i-1]);
        }
        m[i-1]--;
        if(m[i-1]){
            for(int j=50*N;j>=0;j--){
                //dp[i][j]=min(dp[i][j],dp[i-1][j]);
                if(j-v[i-1]>=0) dp[i][j]=min(dp[i][j],dp[i][j-v[i-1]]+w[i-1]);
            }
            m[i-1]--;
        }
    }
    
    vector<int> ord(N);
    iota(ord.begin(),ord.end(),0);
    sort(ord.begin(),ord.end(),[&](int i,int j){
        return v[i] * w[j] > v[j] * w[i];
    });
    
    for(int j=0;j<=50*N;j++){
        if(dp[N][j]>W) continue;
        ll rem=W-dp[N][j];
        ll sum=j;
        for(int i=0;i<N;i++){
            int id=ord[i];
            ll use=min(rem/w[id],m[id]);
            sum+=v[id]*use;
            rem-=w[id]*use;
        }
        ans=max(ans,sum);
    }
    
    cout<<ans<<endl;
}


