import sys
budget,s = map(int,input().split())
desk = [list(map(int,line.split())) for line in sys.stdin]
# 构建新列表,取附件的情况
primary={}
# 表结构
# primary={priv_index:[sub1,sub2]}
for i in range(s):
priIndex = desk[i][2]-1
if priIndex ==-1:
# 主键
primary[i] = primary.get(i,[]) # 如果i不在primary中,增加
else:
# 说明是附件
primary[priIndex] = primary.get(priIndex,[]) + [i]
# 构建新列表,区分有附件的和没有附件的情况
nosub = []
hassub = []
for i in primary.keys():
if primary[i] ==[]:
nosub.append(i)
else:
hassub.append(i)
fullgoods = nosub+hassub
# 构建dp数组,
k = 10 # 先考虑简单情况,再算能被100等更大的数整除的情况
m = int(budget/k)
n = len(fullgoods)
dp = [[0]*(m+1) for _ in range(n+1)]
def primary_and_sub_list(i:int):
# 逻辑是每个物品返回
# 输入物品的index
# 用于返回一个有附件物品的情况组合列表
# 当前物品含有附件,分四种情况
# 1.只有主件
# 2.主件+附件1
# 3.主件+附件2
# 4.主件+ 附件1+附件2
# 取几种情况的最大值
# now = desk[i]
price0,value0 = desk[i][0],desk[i][0]*desk[i][1]
subgoods = [desk[j] for j in primary[i]]
value = [value0]
price = [price0]
while subgoods:
k = subgoods.pop()
price.append(k[0]+price0)
value.append(k[0]*k[1]+value0)
for u in subgoods:
price.append(u[0]+k[0]+price0)
value.append(u[0]*u[1]+k[0]*k[1]+value0)
#print(price,value)
return price,value
# 填表:
for i in range(1,n+1):
for j in range(1,m+1):# 每次多k元
goodIndexi = fullgoods[i-1]# dp列表多了0行
if goodIndexi in hassub:
pricelist,valuelist = primary_and_sub_list(goodIndexi)
solution = [dp[i-1][j]]
for pricei,valuei in zip(pricelist,valuelist):
if pricei <= j*k:
# 能放下
addthis = dp[i-1][j-int(pricei/k)]+valuei # 放此物品
# notadd = dp[i-1][j] # 不放
solution.append(addthis)
dp[i][j]=max(solution)
else:
# 不含附件
pricei = desk[goodIndexi][0]
value = desk[goodIndexi][0]*desk[goodIndexi][1]
if pricei <= j*k:
# 能放下
addthis = dp[i-1][j-int(pricei/k)]+value # 放此物品
notadd = dp[i-1][j] # 不放
dp[i][j] = max(addthis,notadd)
else:
# 不能放下
dp[i][j]=dp[i-1][j]
print(dp[-1][-1])