import java.util.*;
//动态规划 01背包问题 时间复杂度O[n*m],空间复杂度O[n]
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //一.数据录入及格式转换
        int n = in.nextInt();//总钱数
        int m = in.nextInt();//物品总数
        Goods[] list = new Goods[m];
        //初始化,避免赋值空指针
        for (int i = 0; i < m; i++) {
            list[i] = new Goods();
        }
        //录入并初始化物品数据list,将附件放入主件属性中
        for (int i = 0; i < m; i++) {
            int price = in.nextInt(); //价格
            int important = in.nextInt(); //重要度
            int mainNo = in.nextInt(); //0为主,否则为所属主件编号

            list[i].price = price; //价格
            list[i].weight = price * important; //满意度

            if (mainNo == 0) {
                list[i].isMain = true;
            } else {
                Goods parent = list[mainNo - 1];
                if (parent.fj1 == null) {
                    parent.fj1 = list[i];
                } else {
                    parent.fj2 = list[i];
                }
            }
        }
        //二、动态规划:
        /**
        dp[i][j]=Max(
            dp[i-1][j],
            dp[i-1][j-v[i]]+w[i],
            dp[i-1][j-v[i]-vfj1[i]]+w[i]+wfj1[i],
            dp[i-1][j-v[i]-vfj2[i]]+w[i]+wfj2[i],
            dp[i-1][j-v[i]-vfj1[i]-vfj2[i]]+w[i]+wfj1[i]+wfj2[i]
            )
         */
        int[] dp = new int[n + 1];
        for (int i = 0; i < m; i++) {
            Goods goods = list[i];
            for (int j = n ; j >= 0; j--) {
                if (!goods.isMain) { //不是主件直接忽略
                    continue;
                }
                int w1 = 0, w2 = 0, w3 = 0, w4 = 0, w5 = 0;
                int max = 0;
                //1.不购买物品i
                max = w1 = dp[j];
                //2.购买物品i
                if (j >= goods.price) {
                    w2 = dp[j - goods.price] + goods.weight;
                    max = Math.max(max, w2);
                }
                //3.购买物品i和附件1
                if (goods.fj1 != null && j >= (goods.price + goods.fj1.price)) {
                    w3 = dp[j - goods.price - goods.fj1.price] + goods.weight + goods.fj1.weight;
                    max = Math.max(max, w3);
                }
                //4.购买物品i和附件2
                if (goods.fj2 != null && j >= (goods.price + goods.fj2.price)) {
                    w4 = dp[j - goods.price - goods.fj2.price] + goods.weight + goods.fj2.weight;
                    max = Math.max(max, w4);
                }
                //5.购买物品i和附件1和附件2
                if (goods.fj1 != null && goods.fj2 != null &&
                        j >= (goods.price + goods.fj1.price + goods.fj2.price)) {
                    w5 = dp[j - goods.price - goods.fj1.price - goods.fj2.price] + goods.weight +
                         goods.fj1.weight + goods.fj2.weight;
                    max = Math.max(max, w5);
                }
                //6.取最大值
                dp[j] = max;
            }
        }

        //三、输出结果
        System.out.print(dp[n]);
    }
}
class Goods {
    int price;//价格
    int weight;//满意度
    boolean isMain;//是否主件
    Goods fj1;//附件1
    Goods fj2;//附件2
}