n, m = map(int, input().split())
items = [tuple(map(int, input().split())) for _ in range(m)]
main_items = []
# 处理主件和附件
for v, p, q in items:
if q == 0:
main_items.append({'v': v, 'p': p, 'attachments': []})
else:
# 所属主件的编号是q,现在要找到对应的main_items中的索引
master_idx = q - 1
if 0 <= master_idx < len(main_items):
main_items[master_idx]['attachments'].append((v, p))
# 生成每个主件的附件组合
groups = []
for master in main_items:
mv = master['v']
mp = master['p']
atts = master['attachments']
k = len(atts)
combinations = []
for mask in range(0, 1 << k):
cost = mv
value = mv * mp
for i in range(k):
if mask & (1 << i):
av, ap = atts[i]
cost += av
value += av * ap
combinations.append((cost, value))
groups.append(combinations)
# 动态规划处理分组背包
dp = [0] * (n + 1)
for group in groups:
for j in range(n, -1, -1):
current_max = dp[j]
for cost, value in group:
if j >= cost:
current_max = max(current_max, dp[j - cost] + value)
dp[j] = current_max
print(max(dp))
/**************************************************************
Problem: 2265
User: admin
Language: Python
Result: Wrong Answer
****************************************************************/