#include<stdio.h>
#include<algorithm>
#include<string>
#include<iostream>
#include<map>
using namespace std;
struct Qr { int a, b, c; }Q[121212];
bool sort_a(Qr a, Qr b) { return a.a < b.a; }
int tr[1212121], tcnt[1212121], tn;
int state[1212121];
void insert_g(int w, int g) {
tr[w + tn] = g, tcnt[w + tn] = 1;
for (int i = (w + tn) / 2; i > 0; i /= 2) {
tr[i] = max(tr[i * 2], tr[i * 2 + 1]);
tcnt[i] = 0;
if (tr[i] == tr[i * 2])tcnt[i] += tcnt[i * 2];
if (tr[i] == tr[i * 2 + 1])tcnt[i] += tcnt[i * 2 + 1];
}
}
map<string, int>M;
int main() {
int n, m = 0, G;
scanf("%d%d", &n, &G);
for (int i = 0; i < n; i++) {
int a, c; string b;
cin >> a >> b >> c;
if (M.find(b) == M.end())M[b] = m++;
Q[i] = { a,M[b],c };
}
sort(Q, Q + n, sort_a);
for (tn = 1; tn <= m; tn *= 2);
for (int i = 0; i <= m; i++)state[i] = G, insert_g(i, G);
int befmx, befcnt;
befmx = G, befcnt = m + 1;
int ans = 0, flag;
for (int i = 0; i < n; i++) {
flag = (state[Q[i].b] == befmx);
state[Q[i].b] += Q[i].c;
insert_g(Q[i].b, state[Q[i].b]);
if (befmx == tr[1] && befcnt == tcnt[1])continue;
if (flag == 1) {
if (befmx >= tr[1]) {
if (tr[1] != state[Q[i].b]) ans++;
if (tr[1] == state[Q[i].b] && tcnt[1]>1) ans++;
}
else if (befcnt > 1) ans++;
}
else if (befmx < tr[1] || (befmx == tr[1] && befcnt < tcnt[1])) ans++;
befmx = tr[1], befcnt = tcnt[1];
}
printf("%d", ans);
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8YWxnb3JpdGhtPgojaW5jbHVkZTxzdHJpbmc+CiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTxtYXA+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnN0cnVjdCBRciB7IGludCBhLCBiLCBjOyB9UVsxMjEyMTJdOwpib29sIHNvcnRfYShRciBhLCBRciBiKSB7IHJldHVybiBhLmEgPCBiLmE7IH0KaW50IHRyWzEyMTIxMjFdLCB0Y250WzEyMTIxMjFdLCB0bjsKaW50IHN0YXRlWzEyMTIxMjFdOwp2b2lkIGluc2VydF9nKGludCB3LCBpbnQgZykgewoJdHJbdyArIHRuXSA9IGcsIHRjbnRbdyArIHRuXSA9IDE7Cglmb3IgKGludCBpID0gKHcgKyB0bikgLyAyOyBpID4gMDsgaSAvPSAyKSB7CgkJdHJbaV0gPSBtYXgodHJbaSAqIDJdLCB0cltpICogMiArIDFdKTsKCQl0Y250W2ldID0gMDsKCQlpZiAodHJbaV0gPT0gdHJbaSAqIDJdKXRjbnRbaV0gKz0gdGNudFtpICogMl07CgkJaWYgKHRyW2ldID09IHRyW2kgKiAyICsgMV0pdGNudFtpXSArPSB0Y250W2kgKiAyICsgMV07Cgl9Cn0KbWFwPHN0cmluZywgaW50Pk07CmludCBtYWluKCkgewoJaW50IG4sIG0gPSAwLCBHOwoJc2NhbmYoIiVkJWQiLCAmbiwgJkcpOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKCQlpbnQgYSwgYzsgc3RyaW5nIGI7CgkJY2luID4+IGEgPj4gYiA+PiBjOwoJCWlmIChNLmZpbmQoYikgPT0gTS5lbmQoKSlNW2JdID0gbSsrOwoJCVFbaV0gPSB7IGEsTVtiXSxjIH07Cgl9Cglzb3J0KFEsIFEgKyBuLCBzb3J0X2EpOwoJZm9yICh0biA9IDE7IHRuIDw9IG07IHRuICo9IDIpOwoJZm9yIChpbnQgaSA9IDA7IGkgPD0gbTsgaSsrKXN0YXRlW2ldID0gRywgaW5zZXJ0X2coaSwgRyk7CglpbnQgYmVmbXgsIGJlZmNudDsKCWJlZm14ID0gRywgYmVmY250ID0gbSArIDE7CglpbnQgYW5zID0gMCwgZmxhZzsKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJZmxhZyA9IChzdGF0ZVtRW2ldLmJdID09IGJlZm14KTsKCQlzdGF0ZVtRW2ldLmJdICs9IFFbaV0uYzsKCQlpbnNlcnRfZyhRW2ldLmIsIHN0YXRlW1FbaV0uYl0pOwoJCWlmIChiZWZteCA9PSB0clsxXSAmJiBiZWZjbnQgPT0gdGNudFsxXSljb250aW51ZTsKCQlpZiAoZmxhZyA9PSAxKSB7CgkJCWlmIChiZWZteCA+PSB0clsxXSkgewoJCQkJaWYgKHRyWzFdICE9IHN0YXRlW1FbaV0uYl0pIGFucysrOwoJCQkJaWYgKHRyWzFdID09IHN0YXRlW1FbaV0uYl0gJiYgdGNudFsxXT4xKSBhbnMrKzsKCQkJfQoJCQllbHNlIGlmIChiZWZjbnQgPiAxKSBhbnMrKzsKCQl9CgkJZWxzZSBpZiAoYmVmbXggPCB0clsxXSB8fCAoYmVmbXggPT0gdHJbMV0gJiYgYmVmY250IDwgdGNudFsxXSkpIGFucysrOwoJCWJlZm14ID0gdHJbMV0sIGJlZmNudCA9IHRjbnRbMV07Cgl9CglwcmludGYoIiVkIiwgYW5zKTsKCXJldHVybiAwOwp9