#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[2005];//dp[i][j]:前i个垃圾到j高度后最大体力值,不能到达为-1,滚动数组省去第一维
int T[105],F[105],H[105],D,G,maxh=0,hhh,maxhunger=10;
struct node{
int T,F,H;
}rub[105];
bool cmp(node A,node B){
return A.T<B.T;
}
void init(){
scanf("%d%d",&D,&G);
for(int i=1;i<=G;i++){
scanf("%d%d%d",&rub[i].T,&rub[i].F,&rub[i].H);
}
hhh=2*D;
for(int i=0;i<hhh;i++) dp[i]=-1;
dp[0]=10;
sort(rub+1,rub+1+G,cmp);
rub[0].T=0;
}
int main(){
init();
for(int i=1;i<=G;i++){
maxh+=rub[i].H;
if(maxh>hhh) maxh=hhh;
int t=rub[i].T-rub[i-1].T;//t>0
for(int j=maxh;j>=0;j--){
if(j>=rub[i].H&&dp[j-rub[i].H]>=t){//可放入
if(dp[j]<0) dp[j]=dp[j-rub[i].H]-t;
else dp[j]=max(dp[j]+rub[i].F-t,dp[j-rub[i].H]-t);
}
else if(dp[j]>=t) dp[j]=dp[j]+rub[i].F-t;
else if(dp[j]<t) dp[j]=-1;
if(j>=D&&dp[j]>=0) {
cout<<rub[i].T;
return 0;
}
// if(i==4) cout<<j<<" "<<dp[j]<<endl;
}
maxhunger=max(maxhunger,dp[0]);
}
cout<<maxhunger;
return 0;
}