/*
一个方案数的dp题。
f[i][j]表示i这个体积面值总和为j能不能凑出来。c[i]是面值,node[i]是重量。
然后转移即可:f[i][j]=f[i-node][j-c[i]](前一个能凑出来这一个一定能)。
只是四重循环枚举比较恶心罢了。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 10
#define maxv 100+10
#define maxm 2500+100
using namespace std;
int n,V,f[maxv][maxm],c[maxn],ans;
struct node
{
int max,min;
}node[maxn];
int main()
{
memset(f,0,sizeof(f));
cin>>V>>n;
for(int i=1;i<=n;i++)
cin>>c[i]>>node[i].min>>node[i].max;
f[0][0]=1;
for(int i=1;i<=V;i++)//枚举总重
{
for(int j=1;j<=50*50;j++)//枚举总面值
{
if(f[i][j]==1) continue;
for(int k=1;k<=n;k++)//枚举第几个硬币。
{
int flag=0;
if(j-c[k]>=0&&i-node[k].min>=0)//必须保证当前的i j有意义,
{
for(int w=node[k].min;w<=node[k].max;w++)//枚举当前硬币重量
{
if(i-w>=0)
{
f[i][j]+=f[i-w][j-c[k]];
if(f[i][j]==1)
{
flag=1;
break;
}
}
}
if(flag) break;
}
}
}
}
ans=0;
for(int j=1;j<=50*50;j++)//求方案数。
if(f[V][j]==1)
ans++;
printf("%d\n",ans);
return 0;
}