#include <iostream>
using namespace std;
int max(int a, int b) {
if (a > b)
return a;
return b;
}
int dp(int i, int n, int* v, int* w, int* q, bool* visit, int m, int** DP) {
//找到所有的主件和附件的组合
//visit是否被买
int a = 0;
int b = 0;
if (i > m - 1)
return 0;
if (visit[i]) {
if (DP[i + 1][n] != -1) {
return DP[i + 1][n];
} else {
if (DP[i + 1][n] == -1)
DP[i + 1][n] = dp(i + 1, n, v, w, q, visit, m, DP);
return DP[i + 1][n];
}
}
if (q[i] == 0) {
int r1 = 0, r2 = 0, r3 = 0, r4 = 0;
int count = 0;
int k = -1, l = -1;
for (int j = i + 1; j < m; ++j) {
if (q[j] - 1 == i) {
if (count == 0) {
k = j;
count++;
} else {
l = j;
count++;
}
}
}
if (count == 0) {
visit[i] = true;
a = dp(i + 1, n, v, w, q, visit, m, DP);
if (v[i] <= n) {
if (DP[i + 1][n - v[i]] != -1) {
b = v[i] * w[i] + DP[i + 1][n - v[i]];
} else {
DP[i + 1][n - v[i]] = dp(i + 1, n - v[i], v, w, q, visit, m, DP);
b = v[i] * w[i] + DP[i + 1][n - v[i]];
}
}
visit[i] = false;
return max(a, b);
} else if (count == 1) {
visit[i] = true;
visit[k] = true;
if (v[i] <= n) {
if (DP[i + 1][n] == -1) {
DP[i + 1][n] = dp(i + 1, n, v, w, q, visit, m, DP);
}
if (DP[i + 1][n - v[i]] == -1) {
DP[i + 1][n - v[i]] = dp(i + 1, n - v[i],
v, w, q, visit, m, DP);
}
r1 = max(DP[i + 1][n], b = v[i] * w[i] + DP[i + 1][n - v[i]]);
if (v[i] + v[k] <= n) {
if (DP[i + 1][n - v[i] - v[k]] == -1) {
DP[i + 1][n - v[i] - v[k]] = dp(i + 1, n - v[i] - v[k],
v, w, q, visit, m, DP);
}
r2 = v[i] * w[i] + v[k] * w[k] + DP[i + 1][n - v[i] - v[k]];
}
}
visit[i] = false;
visit[k] = false;
return max(r1, r2);
} else if (count == 2) {
visit[i] = true;
visit[k] = true;
visit[l] = true;
if (v[i] <= n) {
if (DP[i + 1][n] == -1) {
DP[i + 1][n] = dp(i + 1, n, v, w, q, visit, m, DP);
}
if (DP[i + 1][n - v[i]] == -1) {
DP[i + 1][n - v[i]] = dp(i + 1,
n - v[i],
v, w, q, visit, m, DP);
}
r1 = max(DP[i + 1][n], v[i] * w[i] + DP[i + 1][n - v[i]]);
if (v[i] + v[k] <= n) {
if (DP[i + 1][n - v[i] - v[k]] == -1)
DP[i + 1][n - v[i] - v[k]] = dp(i + 1, n - v[i] - v[k],
v, w, q, visit, m, DP);
r2 = v[i] * w[i] + v[k] * w[k] + DP[i + 1][n - v[i] - v[k]];
}
if (v[i] + v[l] <= n) {
if (DP[i + 1][n - v[i] - v[l]] == -1)
DP[i + 1][n - v[i] - v[l]] = dp(i + 1, n - v[i] - v[l],
v, w, q, visit, m, DP);
r3 = v[i] * w[i] + v[l] * w[l] + DP[i + 1][n - v[i] - v[l]];
}
if (v[i] + v[k] + v[l] <= n) {
if (DP[i + 1][n - v[i] - v[k] - v[l]] == -1)
DP[i + 1][n - v[i] - v[k] - v[l]] = dp(i + 1, n - v[i] - v[k] - v[l],
v, w, q, visit, m, DP);
r4 = v[i] * w[i] + v[k] * w[k] + v[l] * w[l] + DP[i + 1][n - v[i] - v[k] -
v[l]];
}
}
visit[i] = false;
visit[k] = false;
visit[l] = false;
return max(max(r1, r2), max(r3, r4));
}
} else {
int r1 = 0, r2 = 0, r3 = 0, r4 = 0;
int count = 1;
int k = q[i] - 1;
int l = -1;
for (int j = i; j < m; ++j) {
if (q[j] - 1 == k) {
l = j;
count++;
break;
}
}
if (count == 1) {
visit[k] = true;
visit[i] = true;
if (v[k] <= n) {
if (DP[i + 1][n] == -1)
DP[i + 1][n] = dp(i + 1, n, v, w, q, visit, m, DP);
if (DP[i + 1][n - v[k]] == -1)
DP[i + 1][n - v[k]] = dp(i + 1,
n - v[k],
v, w, q, visit, m, DP);
r1 = max(DP[i + 1][n], DP[i + 1][n - v[k]]);
if (v[i] + v[k] <= n) {
if (DP[i + 1][n - v[i] - v[k]] == -1)
DP[i + 1][n - v[i] - v[k]] = dp(i + 1, n - v[i] - v[k],
v, w, q, visit, m, DP);
r2 = v[i] * w[i] + v[k] * w[k] + DP[i + 1][n - v[i] - v[k]];
}
}
visit[k] = false;
visit[i] = false;
return max(r1, r2);
} else if (count == 2) {
visit[k] = true;
visit[i] = true;
visit[l] = true;
if (v[k] <= n) {
if (DP[i + 1][n] == -1)
DP[i + 1][n] = dp(i + 1, n, v, w, q, visit, m, DP);
if (DP[i + 1][n - v[k]] == -1)
DP[i + 1][n - v[k]] = dp(i + 1,
n - v[k],
v, w, q, visit, m, DP);
r1 = max(DP[i + 1][n], v[k] * w[k] + DP[i + 1][n - v[k]]);
if (v[i] + v[k] <= n) {
if (DP[i + 1][n - v[i] - v[k]] == -1)
DP[i + 1][n - v[i] - v[k]] = dp(i + 1, n - v[i] - v[k],
v, w, q, visit, m, DP);
r2 = v[i] * w[i] + v[k] * w[k] + DP[i + 1][n - v[i] - v[k]];
}
if (v[k] + v[l] <= n) {
if (DP[i + 1][n - v[k] - v[l]] == -1)
DP[i + 1][n - v[k] - v[l]] = dp(i + 1, n - v[k] - v[l],
v, w, q, visit, m, DP);
r3 = v[k] * w[k] + v[l] * w[l] + DP[i + 1][n - v[k] - v[l]];
}
if (v[i] + v[k] + v[l] <= n) {
if (DP[i + 1][n - v[i] - v[k] - v[l]] == -1)
DP[i + 1][n - v[i] - v[k] - v[l]] = dp(i + 1, n -v[i] - v[k] - v[l],
v, w, q, visit, m, DP);
r4 = v[i] * w[i] + v[k] * w[k] + v[l] * w[l] + DP[i + 1][n - v[i] - v[k] -
v[l]];
}
}
visit[k] = false;
visit[i] = false;
visit[l] = false;
return max(max(r1, r2), max(r3, r4));
}
}
return 0;
}
int main() {
int m, n;
cin >> n >> m;
int* v = new int [m];
int* w = new int [m];
int* q = new int [m];
bool* visit = new bool [m];
int** DP = new int* [m + 1];
for (int i = 0; i < m + 1; ++i)
DP[i] = new int [n + 1];
for (int i = 0; i < m + 1; ++i)
for (int j = 0; j < n + 1; ++j)
DP[i][j] = -1;
for (int i = 0; i < m; ++i) {
cin >> v[i] >> w[i] >> q[i];
visit[i] = false;
}
cout << dp(0, n, v, w, q, visit, m, DP);
}
// 64 位输出请用 printf("%lld")