int v[M];
int w[M];
int f[2][N][2];
vector<int>son[M];
bool flag[M];
void solve(int times)
{
int n,m;cin >> n >> m;
int fa;
for(int i = 1;i <= m;i++){
cin >> v[i] >> w[i] >> fa;
if(fa == 0){
flag[i] = 1;
}else son[fa].push_back(i);
w[i] = v[i]*w[i];
}
for(int i = 1;i <= m;i++){
for(int j = 0;j <= n;j++){
if(!flag[i]){
f[i%2][j][0] = max(f[(i-1)%2][j][0],f[(i-1)%2][j][1]);
continue;
}
f[i%2][j][0] = max(f[(i-1)%2][j][0],f[(i-1)%2][j][1]);
if(j - v[i] >= 0)f[i%2][j][1] = max(f[(i-1)%2][j - v[i]][1],f[(i-1)%2][j - v[i]][0]) + w[i];
if(son[i].size() == 1 && j - v[i] - v[son[i][0]] >= 0)f[i%2][j][1] = max(f[i%2][j][1],max(f[(i-1)%2][j - v[i] - v[son[i][0]]][1],f[(i-1)%2][j - v[i] - v[son[i][0]]][0]) + w[i] + w[son[i][0]]);
if(son[i].size() == 2 && j - v[i] - v[son[i][1]] >= 0)f[i%2][j][1] = max(f[i%2][j][1],max(f[(i-1)%2][j - v[i] - v[son[i][1]]][1],f[(i-1)%2][j - v[i] - v[son[i][1]]][0]) + w[i] + w[son[i][1]]);
if(son[i].size() == 2 && j - v[i] - v[son[i][1]] - v[son[i][0]] >= 0)f[i%2][j][1] = max(f[i%2][j][1],max(f[(i-1)%2][j - v[i] - v[son[i][0]] - v[son[i][1]]][1],f[(i-1)%2][j - v[i] - v[son[i][0]] - v[son[i][1]]][0]) + w[i] + w[son[i][0]] + w[son[i][1]]);
}
}
cout << max(f[m%2][n][1],f[m%2][n][0]);
}