#include<iostream>
using namespace std;
using ll=long long;
//没必要考虑馅饼的运动,我们只关心馅饼“何时”到达底部。
//只有在某一秒末正好到达的馅饼,才会计数
//以时间为轴进行动态规划,已知起点,未知终点
//故从后往前递推(为何?因为“发散or收敛”?)
//从后往前推并不会影响结果的正确性(为何?)
int dp[105][1500];//位置和到达时间
int path[105][1500];//记录路径
int dx[5]={-2,-1,0,1,2};
int main()
{
int m,h;
cin>>m>>h;
int a,b,c,d;
int maxt=0;
while(cin>>a>>b>>c>>d)
{
if((h-1)%c!=0)//不能正好到达
continue;
int t=(h-1)/c+a;//到达时刻=起始时刻+掉落时间
dp[b][t]+=d;
maxt=max(t,maxt);
}
for(int i=maxt;i>=0;--i)//枚举时间
{
for(int j=1;j<=m;++j)//枚举位置
{
int maxdp=0;
int index=0;
for(int k=0;k<5;++k)
{
int tp=(j+dx[k]);
if(tp<1||tp>m)
continue;
//试图“tp<=0?1:tp” ,是错误的!哪怕当前点在左边界无法转移
//也会被认定为和当前位置相同的分值
if(dp[tp][i+1]>maxdp)//找到最优子解
{
maxdp=dp[tp][i+1];
index=tp;//记录从哪里转移过来
}
}
dp[j][i]+=maxdp;
path[j][i]=index;//path中保存上一秒所在的位置,如果他自己就是端点,那么值就为0
}
}
int t=0;
cout<<dp[(m+1)/2][t]<<endl;
/*
while(dp[pos][t])
{
int x=path[pos][t];
pos+=x;
t++;
if(dp[pos][t])
cout<<x<<endl;
}
*/
int pos=(m+1)/2;
for(int i=0;i<=maxt;++i)//从起点回溯
{
int tt=path[pos][i];
if(tt==0)
break;
cout<<tt-pos<<endl;
pos=tt;
}
}