#include<cstdio>
#include<vector>
#include<algorithm>
#define INF 1<<30
using namespace std;
int i,j,n,t,de[100000],dr,st,fol[1<<21];
int rez,ar[1<<23];
struct nod
{
int a,b,c;
}x[55000];
vector<int> t1[1000005];
void update(int st ,int dr,int i,int val, int poz)
{
if(st==dr)
{
ar[i]=val;
return ;
}
int mij=(st+dr)/2;
if(poz<=mij) update(st,mij,i*2,val,poz);
else update(mij+1,dr,i*2+1,val,poz);
ar[i]=min(ar[i*2],ar[i*2+1]);
}
void update1(int st ,int dr,int i, int poz,int ok)
{
if(st==dr)
{
if(ok) ar[i]=INF;
return ;
}
int mij=(st+dr)/2;
if(poz<=mij) update1(st,mij,i*2,poz,ok);
else update1(mij+1,dr,i*2+1,poz,ok);
ar[i]=min(ar[i*2],ar[i*2+1]);
}
int main()
{
freopen("gardieni.in","r",stdin);
freopen("gardieni.out","w",stdout);
scanf("%d%d",&n,&t);
for(i=1;i<=n;++i)
scanf("%d%d%d",&x[i].a,&x[i].b,&x[i].c);
for(i=0;i<1<<23;++i) ar[i]=INF;
for(i=1;i<=n;++i)
{
t1[ x[i].a ].push_back(i);
t1[ x[i].b+1].push_back(-i);
}
dr=0;st=1;
for(i=1;i<=t;++i)
{
int m=t1[i].size();
for(j=0;j<m;++j)
{
int ok=0;
if(t1[i][j]>0)
{
int ind=t1[i][j];
fol[ x[ind].c]++;
update(1,n,1,x[ind].c,x[ind].c);
}
else if(t1[i][j]<0)
{
int ind=-t1[i][j];
fol[x[ind].c]--;
if(!fol[x[ind].c]) ok=1;
update1(1,n,1,x[ind].c,ok);
}
}
rez+=ar[1];
}
printf("%d\n",rez);
fclose(stdin);
fclose(stdout);
return 0;
}