#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <unordered_map>
using namespace std;

int main() {
    int money;
    int num;
    cin >> money >> num;
    vector<vector<int>> products;
    unordered_map<int, vector<int>> apeds;
    int index = 0;
    int a, b, c;
    //输入到数组
    while (cin >> a >> b >> c) {
        products.push_back({a, a * b, c});
        if (c != 0) {
            apeds[c - 1].emplace_back(index);
        }
        index++;
    }
    //转换分组背包
    vector<vector<vector<int>>> groups;
    index = 0;
    //处理没有附件的主件
    for (auto& pro : products) {
        if (pro[2] == 0 && apeds.count(index) == 0) {
            groups.push_back({{pro[0], pro[1]}});
        }
        index++;
    }
    //处理有附件的主件及其附件
    for (auto& [index, asso] : apeds) {
        int m_cost = products[index][0];
        int m_happy = products[index][1];
        int n = asso.size();
        vector<vector<int>>group;
        for (int mask = 0; mask < (1 << n); mask++) {
            int cost = m_cost;
            int happy = m_happy;
            for (int i = 0 ; i  <  n ; i++) {
                if (mask & (1 << i)) {
                    vector<int>& aped = products[asso[i]];
                    cost += aped[0];
                    happy += aped[1];
                }
            }
            group.push_back({cost, happy});
        }
        groups.push_back(group);
    }
    //计算分组背包
    vector dp (money + 1, 0);
    for (const auto& group : groups) { //枚举分组
        for (int m = money; m >= 0; m--) { //枚举背包容量(逆序,防止数据覆盖)
            for (const auto& val : group) { //更新每个背包的最大满意度
                if (m >= val[0])
                dp[m] = max(dp[m], dp[m - val[0]] + val[1]);
            }
        }
    }
    cout << *max_element(dp.begin(), dp.end()) << endl;
    return 0;
}