#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int dp[10050];
struct sa{
int x,y,sum;
}p[10050];
//我觉得结构体的基础知识你得复习下
int cmp(const sa a,const sa b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
//比较函数
int main(){
int n,m,t;
scanf("%d%d%d",&n,&m,&t);
//一个整个时间段,一个是 能挤几次,最后一个是要恢复的时间
for(int i=0;i<m;i++){
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].sum);
//每次挤的时间区间和能挤出的量
p[i].y+=t;
//把延续的时间一加,就当这个时间段都只能做一个了
}
sort(p,p+m,cmp);
//这个排序要看上面的cmp,挺值得学习的
//另外这个排序对于这个题也挺关键的
for(int i=m-1;i>=0;i--){
dp[i]=p[i].sum;
//嗯因为是在外面定义的所以全是零喽
//至于i的开始我觉得你得去问问你的排序怎么排的
for(int j=i+1;j<m;j++)
if(p[j].x>=p[i].y){
dp[i]=max(dp[i],dp[j]+p[i].sum);
}
//转印方程还得思考思考
//类比才是王道,直接类比个地下城的刷图,固定下时间就ok
//我觉得这转移方程也不好想吖
}
int maxx=0;
for(int i=0;i<m;i++)
maxx=max(maxx,dp[i]);
cout<<maxx<<endl;
return 0;
}