// https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
// 牛客-hw机考-HJ16 购物单
#include <iostream>
#include <vector>
using namespace std;
struct GiftInfo {
int v {};
int satisfaction {};
};
void Solution()
{
int N = 0;
int m = 0;
cin >>N >>m;
vector<vector<GiftInfo> > giftInfo(m+1, vector<GiftInfo>(3, {0}));
for (int i = 1; i <= m; ++i) {
int v, p, q {};
cin >> v >>p >>q;
int mainItems = q > 0 ? q : i;
int ItemsBelong = q > 0 ? (giftInfo[q][1].v == 0 ? 1 : 2) : 0;
giftInfo[mainItems][ItemsBelong].v = v;
giftInfo[mainItems][ItemsBelong].satisfaction = v * p;
}
int totalAmount = N / 10;
vector<vector<int> > dp(m+1, vector<int>(totalAmount+1, {0}));
for (int i = 1; i <= m; ++i) {
int v = 0, sf = 0;
int v0 = giftInfo[i][0].v/10, sf0 = giftInfo[i][0].satisfaction/10;
int v1 = giftInfo[i][1].v/10, sf1 = giftInfo[i][1].satisfaction/10;
int v2 = giftInfo[i][2].v/10, sf2 = giftInfo[i][2].satisfaction/10;
for (int j = 1; j <= totalAmount; j++) {
v = v0; sf = sf0;
dp[i][j] = j >= v ? max(dp[i-1][j-v] + sf, dp[i-1][j]) : dp[i-1][j];
v = v0 + v1; sf = sf0 + sf1;
dp[i][j] = j >= v ? max(dp[i-1][j-v] + sf, dp[i][j]) : dp[i][j];
v = v0 + v2; sf = sf0 + sf2;
dp[i][j] = j >= v ? max(dp[i-1][j-v] + sf, dp[i][j]) : dp[i][j];
v = v0 + v1 + v2; sf = sf0 + sf1 + sf2;
dp[i][j] = j >= v ? max(dp[i-1][j-v] + sf, dp[i][j]) : dp[i][j];
}
}
cout << dp[m][totalAmount]*10 <<endl;
}
int main()
{
Solution();
return 0;
}