#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//源码作者:华科不平凡
/*
解题思路:
01背包变体,相较于01背包问题的容积限制,这里以总钱数为限制,计算在一定钱数范围内的满意度 价格*权重。
比01背包麻烦的地方在于分组。
题中有附件必须有附件依赖的主件,且主件最多有两个附件,那么分组 可分为 只有主件、主件+附件1、主件+附件2、主件+附件1、2
dp[i][j]表示在奖金数j的范围内,取前i件物品的满意度
int a1 = price[i][0], a2 = weight[i][0];//主件
int b1 = price[i][1], b2 = weight[i][1];//附件1
int c1 = price[i][2], c2 = weight[i][2];//附件2
1.dp[i][j] = j >= a1 ? max(dp[i-1][j], dp[i-1][j-a1] + a2) : dp[i-1][j];//主件,如果钱能够覆盖主件,就取加入与不加入该主件的最大值;如果钱覆盖不了,就取不加入主件的值
2.dp[i][j] = j >= (a1+b1) ? max(dp[i][j],dp[i-1][j-a1-b1] + a2 + b2) : dp[i][j];//主件+附件1,关键点在于取最大值是dp[i][j]与加主件、附件的比较,因为如果能覆盖主件+附件,那么必
满足状态1,就应该继承状态1的dp[i][j]参与比较而非dp[i-1][j],后续状态3 4也是如此
3.dp[i][j] = j >= (a1+c1) ? max(dp[i][j],dp[i-1][j-a1-c1]+ a2 + c2) : dp[i][j];//主件+附件2
4.dp[i][j] = j >= (a1+b1+c1) ? max(dp[i][j],dp[i-1][j-a1-b1-c1] + a2 + b2 +c2) : dp[i][j];//主件+附件1+附件2
*/
int main() {
    int N,m;//N:总钱数,m:可购买物品的个数
    cin >> N >> m;

    N /= 10;//每件价格为10的整数倍,可进一步缩小dp
    vector<vector<int> > price(m+1,vector<int>(3,0));//价格
    vector<vector<int> > weight(m+1,vector<int>(3,0));//满意度
    int p,w,type;//分别表示物品价格、重要度、主/附件
    for(int i = 1; i <= m; ++i){
        cin >> p >> w >>type;
        p /= 10;//与总钱数保持一致
        w = p * w;//进一步变为满意度
        if(type == 0){//是主件
            price[i][0] = p;
            weight[i][0] = w;
        }else{//是附件
            if(price[type][1] == 0){//主件type的附件1
                price[type][1] = p;
                weight[type][1] = w;
            }else{//主件type的附件2
                price[type][2] = p;
                weight[type][2] = w;
            }
        }
    }
    //dp[i][j]表示恰好花费j元下买i件物品的最大满意度
    vector<vector<int> > dp(m+1,vector<int>(N+1,0));
   
    //分组,物品搭配(主件,主件+附件1,主件+附件2,主件+附件1+附件2)
    for(int i = 1; i <= m; i++){
        for(int j = 1; j <= N; j++){//其实可以加各判断price[i][0]是否为0,是0就跳过因为有附件那么price[i][0]在m件内必有0,因为附件算在主件的price[i][1] [1][2]内
            int a1 = price[i][0], a2 = weight[i][0];//主件
            int b1 = price[i][1], b2 = weight[i][1];//附件1
            int c1 = price[i][2], c2 = weight[i][2];//附件2
            dp[i][j] = j >= a1 ? max(dp[i-1][j], dp[i-1][j-a1] + a2) : dp[i-1][j];//主件
            dp[i][j] = j >= (a1+b1) ? max(dp[i][j],dp[i-1][j-a1-b1] + a2 + b2) : dp[i][j];//主件+附件1
            dp[i][j] = j >= (a1+c1) ? max(dp[i][j],dp[i-1][j-a1-c1]+ a2 + c2) : dp[i][j];//主件+附件2
            dp[i][j] = j >= (a1+b1+c1) ? max(dp[i][j],dp[i-1][j-a1-b1-c1] + a2 + b2 +c2) : dp[i][j];//主件+附件1+附件2
        }
    }
    cout << dp[m][N]*10 << endl;
}
// 64 位输出请用 printf("%lld")