/*
    题意:有n种食物需要准备,每种食物一个人需要x[i],有库存y[i]
    每种食物都有两种购买的选择,s1[i],p1[i],s2[i],p2[i]
    s,p分别为物品的数量还有价格
    问最多能满足多少人,每个人都要同时满足n种

    二分人数limit,然后判可行性
    可行性判断有两种方法:
    1) 完全背包做   n*10^6左右
    2) 枚举其中一种物品的数量(要选较少的那个枚举,不然会TLE)  这种比较快
       如果知道其中一种物品的数量的话,另一种可直接计算出来
    启示:
    这种做法快,主要是由于只枚举个数(不枚举容量),而且确定了一种的个数,另外一种也会确定的!
*/

#include
<cstdio>
#include
<algorithm>
#include
<cstring>

using namespace std;

const int MAXN = 101;
const int INF = 1000000000;

inline 
int min(int a,int b){return a<b?a:b;}

int s1[MAXN],s2[MAXN],p1[MAXN],p2[MAXN];
int x[MAXN],y[MAXN];
int dp[1000101];//最多也就10^6
int N,M;

//int cal(int n,int need)
//{
//    int m = need+s2[n];
//    fill(dp,dp+m+1,INF);
//    dp[0]=0;
//    for(int j=0;j<=m;j++)
//    {
//        if(dp[j]==INF)continue;
//        if(j+s1[n]<=m)
//            dp[j+s1[n]]=min(dp[j+s1[n]],dp[j]+p1[n]);
//        if(j+s2[n]<=m)
//            dp[j+s2[n]]=min(dp[j+s2[n]],dp[j]+p2[n]);
//    }
//    return *min_element(dp+need,dp+m+1);
//}
//
//bool chk(int limit)
//{
//    int cost = 0;
//    for(int i=1;i<=N;i++)
//    {
//        int need = limit*x[i]-y[i];
//        if(need>1000000)return false;//对于超过10^6的,直接false
//        if(need>0)
//            cost+=cal(i,need);
//        if(cost>M)return false;
//    }
//    return true;
//}

bool chk(int limit)
{
    
int cost = 0;
    
for(int i=1;i<=N;i++)
    
{
        
int Min = INF , need = limit*x[i]-y[i];
        
if(need<=0)Min=0;
        
else
        
{
            
//最多能买的个数
            int na = (M-cost)/p1[i];
            
int nb = (M-cost)/p2[i];
            
if(na<nb)
            
{
                
for(int a=0,b;a<=na;a++)
                
{
                    
int tmp = need-a*s1[i];
                    
if(tmp<=0)b=0;
                    
else b = (tmp-1)/s2[i]+1;//取上界   如果a=0,b=1时就不能用(a-1)/b+1来计算!
                    Min = min(Min,a*p1[i]+b*p2[i]);
                    
if(b==0)break;
                }

            }

            
else
            
{
                
for(int b=0,a;b<=nb;b++)
                
{
                    
int tmp = need-b*s2[i];
                    
if(tmp<=0)a=0;
                    
else a = (tmp-1)/s1[i]+1;
                    Min 
= min(Min,a*p1[i]+b*p2[i]);
                    
if(a==0)break;
                }

            }

        }

        cost
+=Min;
        
if(cost>M)return false;
    }

    
return true;
}


int main()
{
    
//freopen("in","r",stdin);
    while(scanf("%d%d",&N,&M),N||M)
    
{
        
for(int i=1;i<=N;i++)
            scanf(
"%d%d%d%d%d%d",&x[i],&y[i],&s1[i],&p1[i],&s2[i],&p2[i]);
        
int low = 0 ,high = M+10;
        
while(high-low>1)
        
{
            
int mid=(high+low)>>1;
            
if(chk(mid))low=mid;
            
else high=mid;
        }

        printf(
"%d\n",low);
    }

    
return 0;
}