import java.util.*;

// 定义物品类
class Goods {
    int v; // 价格
    int degree; // 满意度
    boolean isMain = false; // 是否为主件

    int a1 = -1; // 附件1的编号
    int a2 = -1; // 附件2的编号
}

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        // 标准输入
        Scanner input = new Scanner(System.in);
        // 获取总金额和商品总个数
        int money = input.nextInt();
        int count = input.nextInt();
        // 初始化物品列表
        List<Goods> list = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            Goods goods = new Goods();
            list.add(goods);
        }
        // 初始化列表数据
        for (int i = 0; i < count; i++) {
            Goods goods = list.get(i);
            int v = input.nextInt();
            int p = input.nextInt();
            int q = input.nextInt();
            // 设置物品属性
            goods.v = v;
            goods.degree = v * p;
            if (q == 0) {
                goods.isMain = true; // 当前物品为主键
            } else if (list.get(q-1).a1 == -1) {
                // 在其对应主件中记录此附件
                list.get(q-1).a1 = i;
            } else {
                list.get(q-1).a2 = i;
            }        
        } // 列表数据初始化完成

        // 初始化动态规划矩阵
        int [][] dp = new int[count+1][money+1];
        // 将矩阵第一行和第一列填充为0,但其默认值已为0,无需再处理

        // 遍历矩阵,进行动态规划
        for (int i = 1; i <= count; i++) {
            // 获取当前物品信息
            Goods curGoods = list.get(i-1);
            int curV = curGoods.v;
            int curD = curGoods.degree;
            // 当前物品是否存在附件
            boolean has_a1 = curGoods.a1 != -1 ? true : false;
            boolean has_a2 = curGoods.a2 != -1 ? true : false;
            // 当前物品的附件
            Goods a1 = has_a1 ? list.get(curGoods.a1) : null;
            Goods a2 = has_a2 ? list.get(curGoods.a2) : null;
        
            for (int j = 1; j <= money; j++) {
                // 预处理,保底填充上行数据
                dp[i][j] = dp[i-1][j];
                if (!curGoods.isMain) {
                    // 当前物品不为主件
                    continue;
                } else { // 当前物品为主件时,对应4种选择
                    
                    // 1.只选择主件
                    if (j >= curV) {
                        dp[i][j] = Math.max(
                            dp[i][j],
                            dp[i-1][j - curV] + curD
                        );
                    }

                    // 2.选择主件和附件1
                    if ( has_a1 && j >= (curV + a1.v) ) {
                        // 状态转移
                        dp[i][j] = Math.max(
                            dp[i][j],
                            dp[i-1][j-curV-a1.v] + curD + a1.degree
                        );
                    }

                    // 3.选择主件和附件2
                    if ( has_a2 && j >= (curV + a2.v) ) {
                        // 状态转移
                        dp[i][j] = Math.max(
                            dp[i][j],
                            dp[i-1][j-curV-a2.v] + curD + a2.degree
                        );
                    }

                    // 4.选择主件、附件1和附件2
                    if (has_a1 && has_a2 && j >= (curV + a1.v + a2.v) ) {
                        // 状态转移
                        dp[i][j] = Math.max(
                            dp[i][j],
                            dp[i-1][j-curV-a1.v-a2.v] + curD + a1.degree + a2.degree
                        );
                    }
                }
            }
        } // 填充矩阵完毕

        // 输出动态规划结果
        System.out.println(dp[count][money]);
    }
}