#include<bits/stdc++.h>
using namespace std;
int n,g,rnk[100001],rlen,ans = 0;
struct node
{
int day,num,deta;
}p[100001];
int lsh(int x)
{
return lower_bound(rnk+1,rnk+1+rlen,x) - (rnk+1)+1;
}
bool cmp(node a,node b)
{
return a.day < b.day;
}
struct sele
{
int val,id;
} s[200001];
int pos[100001];
int slen = 0;
bool findnums(int x)
{
return (s[1].val == s[2].val || s[1].val == s[3].val);
}
void shift_up(int cur)
{
while(cur != 1 && s[cur].val > s[cur/2].val)
{
swap(s[cur],s[cur/2]);
swap(pos[s[cur].id],pos[s[cur/2].id]);
cur /= 2;
}
}
void shift_down(int u)
{
while(1)
{
int p = u << 1;
int q = p + 1;
int v;
if(p > slen)
break;
else if(q > slen) v = p;
else
{
if(s[p].val > s[q].val) v = p;
else v = q;
}
if(s[u].val < s[v].val)
{
swap(s[u],s[v]);
swap(pos[s[u].id],pos[s[v].id]);
u = v;
}
else break;
}
}
int main()
{
cin >> n >> g;
for(int i = 1;i <= n;i++)
{
scanf("%d %d %d",&p[i].day,&p[i].num,&p[i].deta);
rnk[i] = p[i].num;
}
sort(rnk+1,rnk+1+n);
rlen = unique(rnk+1,rnk+1+n) - (rnk+1);
sort(p+1,p+n+1,cmp);
for(int i = 1;i <= rlen;i++)
{
sele u;
u.val = 0,u.id = i;
s[++slen] = u;
pos[i] = slen;
}
for(int i = 1;i <= n;i++)
{
int sid = pos[lsh(p[i].num)],top = s[1].val;
bool flag = findnums(s[1].val);
int oldval = s[sid].val;
s[sid].val += p[i].deta;
int newval = s[sid].val;
if(p[i].deta > 0)
{
if(s[sid].val == top) ans++;
if(s[sid].val > top && sid != 1) ans ++;
if(s[sid].val > top && sid == 1 && flag == 1) ans ++;
shift_up(sid);
}
if(p[i].deta < 0)
{
shift_down(sid);
if(oldval == top && newval != s[1].val) ans ++;
if(oldval == top && newval == s[1].val && findnums(s[1].val) == 1) ans ++;
}
}
cout<<ans<<endl;
return 0;
}