//和有依赖的背包相似,这个是循环的方案数
#include<iostream>
#include<vector>
using namespace std;
const int N=70,M=32010;
int f[M];
typedef pair<int,int> PII;
vector<PII> sv[N];
PII master[N];
int n,m;
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++)
{
int v,p,t;
scanf("%d%d%d",&v,&p,&t);
p*=v;
if(!t)master[i]={v,p};
else sv[t].push_back({v,p});
}
for(int i=1;i<=n;i++)
for(int u=m;u>=0;u--)
{
//买附件等价于买主见,直接选主件买
for(int j=0;j<1<<sv[i].size();j++) //所有选择情况
{
int v=master[i].first,w=master[i].second; //主件
for(int k=0;k<sv[i].size();k++)
if(j>>k&1) //每一位相当于物品,选择情况
{
v+=sv[i][k].first;
w+=sv[i][k].second;
//累加这一类的费用,价值
}
if(u>=v)f[u]=max(f[u],f[u-v]+w);
}
}
printf("%d",f[m]);
}