#include <iostream>
#include <math.h>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <iomanip>
#include <set>
#include <bitset>
#include <unordered_map>
#define int long long
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using piii = tuple<int,int,int>;
#define f first
#define s second
#define endl '\n'
#define all(x) begin(x),end(x)
int const caseN = 1e4+10;
signed main(){
ios_base::sync_with_stdio(0);cin.tie(0);
int n;cin >> n;
int d;cin >> d;
if(d < caseN){
vector<vector<int>> pref(d+1,vector<int>(d+1,0));
for(int i{};i < n;i++){
int a,b,c;cin >> a >> b >> c;
c = min(c,d);
pref[a][c] += b;
}
for(int i{1};i <= d;i++){
for(int j{d-1};j >= 0;j--){
pref[i][j] += pref[i][j+1];
//cout << pref[i][j] << " ";
}
//cout << endl;
}
for(int i{1};i <= d;i++){
int cur = i;
bool exit = 0;
for(int j{1};j <= d;j++){
cur--;
if(cur < 0){
exit = 1;
break;
}
cur += pref[j][i];
}
if(!exit){
cout << i << endl;
return 0;
}
}
}
else{
vector<piii> vc;
vector<int> checking;
for(int i{};i < n;i++){
int a,b,c;cin >> a >> b >> c;
vc.emplace_back(a,b,c);
checking.emplace_back(c);
}
vc.emplace_back(d,0,0);
sort(all(vc));
sort(all(checking));
checking.erase(unique(all(checking)),checking.end());
int ans = d;
int si = checking.size();
for(int i{};i < si;i++){
int F = checking[i];
int cur = 0;
int val = 0;
int last = 0;
for(auto [a,b,c]:vc){
cur -= a-last;
val = max(val,-cur);
if(c >= F) cur += b;
last = a;
}
if(val <= F){
ans = min(ans,val);
}
//cout << F << " " << val << endl;
}
cout << ans;
}
}