import java.util.Scanner;
import java.util.*;
// 01背包 ,附件与主件绑定,两者合并可以看成另一件物品,通过预处理,整理成一堆新的物品
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int N = in.nextInt();
int m = in.nextInt();
int[] vs = new int[m];
int[] ps = new int[m];
int[] qs = new int[m];
for(int i = 0; i < m; i++) {
vs[i] = in.nextInt();
ps[i] = in.nextInt();
qs[i] = in.nextInt();
}
System.out.println(maxValue(N, vs, ps, qs));
}
}
public static int maxValue(int n, int[] vs, int[] ps, int[] qs) {
ArrayList<Item> items = new ArrayList<Item>();
Item[] arr = new Item[vs.length];
//预处理
for(int i = 0; i < vs.length; i++) {
Item item = null;
if(qs[i] == 0) {
if(arr[i] != null) {
arr[i].setVal(vs[i],ps[i]);
} else {
item = new Item(vs[i], ps[i], false);
arr[i] = item;
}
} else {
if(arr[qs[i]-1] != null) {
arr[qs[i]-1].setSub(vs[i],ps[i]);
} else {
if(qs[i]-1 <= i) {
arr[qs[i]-1].setSub(vs[i],ps[i]);
} else{
item = new Item(vs[i], ps[i], true);
arr[qs[i]-1] = item;
}
}
}
}
for(Item item : arr) {
if(item != null) {
items.add(item);
}
}
//背包和物品临界值加1 为了节省初始化步骤
int[][] dp = new int[items.size()+1][n+1];
for(int i = 1; i <= items.size(); i++) {
for(int j = 0; j <= n; j++) {
dp[i][j] = dp[i-1][j];
if(j >= items.get(i-1).val) {
dp[i][j] = Math.max(dp[i][j], dp[i-1][j-items.get(i-1).val]
+ items.get(i-1).val*items.get(i-1).p);
}
if(j >= items.get(i-1).val + items.get(i-1).sub1) {
dp[i][j] = Math.max(dp[i][j],
dp[i-1][j-items.get(i-1).val-items.get(i-1).sub1]
+ items.get(i-1).val*items.get(i-1).p
+ items.get(i-1).sub1p*items.get(i-1).sub1);
}
if(j >= items.get(i-1).val + items.get(i-1).sub2) {
dp[i][j] = Math.max(dp[i][j],
dp[i-1][j-items.get(i-1).val- items.get(i-1).sub2]
+items.get(i-1).val*items.get(i-1).p
+items.get(i-1).sub2*items.get(i-1).sub2p);
}
if(j >= items.get(i-1).val + items.get(i-1).sub1 + items.get(i-1).sub2) {
dp[i][j] = Math.max(dp[i][j],
dp[i-1][j-items.get(i-1).val-items.get(i-1).sub1-items.get(i-1).sub2]
+items.get(i-1).val*items.get(i-1).p
+items.get(i-1).sub1*items.get(i-1).sub1p
+items.get(i-1).sub2*items.get(i-1).sub2p);
}
}
}
return dp[items.size()][n];
}
public static class Item {
int sub1;
int sub1p;
int sub2;
int sub2p;
int val;
int p;
public Item(int val, int p, boolean isSub) {
if(isSub) {
setSub(val, p);
} else {
this.val = val;
this.p = p;
}
}
private void setVal(int val, int p) {
this.val = val;
this.p = p;
}
private void setSub(int subval, int subp) {
if(sub1 == 0) {
sub1 = subval;
sub1p = subp;
} else {
sub2 = subval;
sub2p = subp;
}
}
}
}