#include <iostream>
using namespace std;
/* 多重背包 二进制拆分
* Time Complexity 大于O(N*V)
* Space Complexity O(N*V)
* 设 V <= 200 N <= 10 ,拆分后 物品总数 < 50
* 每件物品有 log n[i]种状态
*/
int maxV[201];
int weight[50]; /* 记录拆分后物体重量 */
int value[50]; /* 记录拆分后物体价值 */
int V, N;
void main()
{
int i, j;
scanf("%d %d",&V, &N);
int weig, val, num;
int count = 0;
for(i = 0; i < N; ++i)
{
scanf("%d %d %d",&weig,&val,&num);
for(j = 1; j <= num; j <= 1) // 二进制拆分
{
weight[count] = j * weig;
value[count++] = j * val;
num -= j;
}
if(num > 0)
{
weight[count] = num * weig;
value[count++] = num * val;
}
}
for(i = 0; i < count; ++i) // 使用01背包
{
for(j = V; j >= weight[i]; --j)
{
int tmp = maxV[j-weight[i]] + value[i];
maxV[j] = maxV[j] > tmp ? maxV[j] : tmp;
}
}
printf("%d",maxV[V]);
}
/*
【输入样例】
4 20
3 9 3
5 9 1
9 4 2
8 1 3
【输出样例】
47
*/