#include <bits/stdc++.h>
using namespace std;
#define tag "spoj"
#define maxn 1007
#define oo 1000000007
#define mid ((l+r)>>1)
#define meset(a,x) memset(a,x,sizeof(a))
#define loop(x) for(int LoOpEr=1;LoOpEr<=x;LoOpEr++)
///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
class it2D{
struct item{
int id;
int l,r;
item(const int &i,const int &L,const int &R): id(i), l(L), r(R) {};
item left()
const{
return item(id<<1,l,mid);
}
item right()
const{
return item(id<<1|1,mid+1,r);
}
bool belong(const int &L,const int &R)
const{
return L<=l && r<=R;
}
bool irrelevent(const int &L,const int &R)
const{
return R<l || L>r;
}
};
int m,n;
item rtx,rty;
vector<vector<int>> node;
void update(const item &dx,const item &dy,const int &x,const int &y,const int &val,const bool &only_y)
{
if(dx.irrelevent(x,x) || dy.irrelevent(y,y)) return;
if(dx.l==dx.r && dy.l==dy.r) return node[dx.id][dy.id]=val,void();
if(dx.l!=dx.r)
{
if(!only_y)
update(dx.left(),dy,x,y,val,false),
update(dx.right(),dy,x,y,val,false);
node[dx.id][dy.id]=max(node[dx.left().id][dy.id],node[dx.right().id][dy.id]);
}
if(dy.l!=dy.r)
{
update(dx,dy.left(),x,y,val,true);
update(dx,dy.right(),x,y,val,true);
if(dx.l==dx.r)
node[dx.id][dy.id]=max(node[dx.id][dy.left().id],node[dx.id][dy.right().id]);
}
}
int get(const item &dx,const item &dy,const int &x1,const int &y1,const int &x2,const int &y2)
{
if(dx.irrelevent(x1,x2) || dy.irrelevent(y1,y2)) return 0;
if(dx.belong(x1,x2))
return dy.belong(y1,y2) ? node[dx.id][dy.id] : max(get(dx,dy.left(),x1,y1,x2,y2),get(dx,dy.right(),x1,y1,x2,y2));
return max(get(dx.left(),dy,x1,y1,x2,y2),get(dx.right(),dy,x1,y1,x2,y2));
}
public:
it2D(const int &M,const int &N): m(M), n(N), rtx(1,1,M), rty(1,1,N), node(vector<vector<int>>(4*M+7,vector<int>(4*N+7))) {};
void update(const int &x,const int &y,const int &val)
{
update(rtx,rty,x,y,val,false);
}
int max_range(const int &x1,const int &y1,const int &x2,const int &y2)
{
return get(rtx,rty,x1,y1,x2,y2);
}
};
int main()
{
#ifdef dmdd
freopen(tag".inp","r",stdin); freopen(tag".out","w",stdout);
#endif // dmdd
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n,k;
cin>>n>>k;
vector<int> x(n+1),y(n+1),z(n+1);
for(int i=1;i<=n;i++) cin>>x[i]>>y[i]>>z[i];
it2D st(2*maxn,2*maxn);
#define krange(x,y) x+y-k,x-y-k+maxn,x+y+k,x-y+k+maxn
for(int i=n,cur;i>=1;i--)
{
cur=st.max_range(krange(x[i],y[i])) + z[i];
st.update(x[i]+y[i],x[i]-y[i]+maxn,cur);
}
cout<<st.max_range(krange(0,0));
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgdGFnICJzcG9qIgojZGVmaW5lIG1heG4gMTAwNwojZGVmaW5lIG9vIDEwMDAwMDAwMDcKI2RlZmluZSBtaWQgKChsK3IpPj4xKQojZGVmaW5lIG1lc2V0KGEseCkgbWVtc2V0KGEseCxzaXplb2YoYSkpCiNkZWZpbmUgbG9vcCh4KSBmb3IoaW50IExvT3BFcj0xO0xvT3BFcjw9eDtMb09wRXIrKykKLy8vPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PgpjbGFzcyBpdDJEewogCiAgICBzdHJ1Y3QgaXRlbXsKIAogICAgICAgIGludCBpZDsKICAgICAgICBpbnQgbCxyOwogCiAgICAgICAgaXRlbShjb25zdCBpbnQgJmksY29uc3QgaW50ICZMLGNvbnN0IGludCAmUik6IGlkKGkpLCBsKEwpLCByKFIpIHt9OwogCiAgICAgICAgaXRlbSBsZWZ0KCkKICAgICAgICBjb25zdHsKICAgICAgICAgICAgcmV0dXJuIGl0ZW0oaWQ8PDEsbCxtaWQpOwogICAgICAgIH0KIAogICAgICAgIGl0ZW0gcmlnaHQoKQogICAgICAgIGNvbnN0ewogICAgICAgICAgICByZXR1cm4gaXRlbShpZDw8MXwxLG1pZCsxLHIpOwogICAgICAgIH0KIAogICAgICAgIGJvb2wgYmVsb25nKGNvbnN0IGludCAmTCxjb25zdCBpbnQgJlIpCiAgICAgICAgY29uc3R7CiAgICAgICAgICAgIHJldHVybiBMPD1sICYmIHI8PVI7CiAgICAgICAgfQogICAgICAgIGJvb2wgaXJyZWxldmVudChjb25zdCBpbnQgJkwsY29uc3QgaW50ICZSKQogICAgICAgIGNvbnN0ewogICAgICAgICAgICByZXR1cm4gUjxsIHx8IEw+cjsKICAgICAgICB9CiAgICB9OwogCiAgICBpbnQgbSxuOwogCiAgICBpdGVtIHJ0eCxydHk7CiAKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gbm9kZTsKIAogICAgdm9pZCB1cGRhdGUoY29uc3QgaXRlbSAmZHgsY29uc3QgaXRlbSAmZHksY29uc3QgaW50ICZ4LGNvbnN0IGludCAmeSxjb25zdCBpbnQgJnZhbCxjb25zdCBib29sICZvbmx5X3kpCiAgICB7CiAgICAgICAgaWYoZHguaXJyZWxldmVudCh4LHgpIHx8IGR5LmlycmVsZXZlbnQoeSx5KSkgcmV0dXJuOwogCiAgICAgICAgaWYoZHgubD09ZHguciAmJiBkeS5sPT1keS5yKSByZXR1cm4gbm9kZVtkeC5pZF1bZHkuaWRdPXZhbCx2b2lkKCk7CiAKICAgICAgICBpZihkeC5sIT1keC5yKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIW9ubHlfeSkKICAgICAgICAgICAgICAgIHVwZGF0ZShkeC5sZWZ0KCksZHkseCx5LHZhbCxmYWxzZSksCiAgICAgICAgICAgICAgICB1cGRhdGUoZHgucmlnaHQoKSxkeSx4LHksdmFsLGZhbHNlKTsKIAogICAgICAgICAgICBub2RlW2R4LmlkXVtkeS5pZF09bWF4KG5vZGVbZHgubGVmdCgpLmlkXVtkeS5pZF0sbm9kZVtkeC5yaWdodCgpLmlkXVtkeS5pZF0pOwogICAgICAgIH0KIAogICAgICAgIGlmKGR5LmwhPWR5LnIpCiAgICAgICAgewogICAgICAgICAgICB1cGRhdGUoZHgsZHkubGVmdCgpLHgseSx2YWwsdHJ1ZSk7CiAgICAgICAgICAgIHVwZGF0ZShkeCxkeS5yaWdodCgpLHgseSx2YWwsdHJ1ZSk7CiAKICAgICAgICAgICAgaWYoZHgubD09ZHgucikKICAgICAgICAgICAgICAgIG5vZGVbZHguaWRdW2R5LmlkXT1tYXgobm9kZVtkeC5pZF1bZHkubGVmdCgpLmlkXSxub2RlW2R4LmlkXVtkeS5yaWdodCgpLmlkXSk7CiAgICAgICAgfQogICAgfQogCiAgICBpbnQgZ2V0KGNvbnN0IGl0ZW0gJmR4LGNvbnN0IGl0ZW0gJmR5LGNvbnN0IGludCAmeDEsY29uc3QgaW50ICZ5MSxjb25zdCBpbnQgJngyLGNvbnN0IGludCAmeTIpCiAgICB7CiAgICAgICAgaWYoZHguaXJyZWxldmVudCh4MSx4MikgfHwgZHkuaXJyZWxldmVudCh5MSx5MikpIHJldHVybiAwOwogCiAgICAgICAgaWYoZHguYmVsb25nKHgxLHgyKSkKICAgICAgICAgICAgcmV0dXJuICBkeS5iZWxvbmcoeTEseTIpID8gbm9kZVtkeC5pZF1bZHkuaWRdIDogbWF4KGdldChkeCxkeS5sZWZ0KCkseDEseTEseDIseTIpLGdldChkeCxkeS5yaWdodCgpLHgxLHkxLHgyLHkyKSk7CiAKICAgICAgICByZXR1cm4gbWF4KGdldChkeC5sZWZ0KCksZHkseDEseTEseDIseTIpLGdldChkeC5yaWdodCgpLGR5LHgxLHkxLHgyLHkyKSk7CiAgICB9CiAKcHVibGljOgogCiAgICBpdDJEKGNvbnN0IGludCAmTSxjb25zdCBpbnQgJk4pOiBtKE0pLCBuKE4pLCBydHgoMSwxLE0pLCBydHkoMSwxLE4pLCBub2RlKHZlY3Rvcjx2ZWN0b3I8aW50Pj4oNCpNKzcsdmVjdG9yPGludD4oNCpOKzcpKSkge307CiAKICAgIHZvaWQgdXBkYXRlKGNvbnN0IGludCAmeCxjb25zdCBpbnQgJnksY29uc3QgaW50ICZ2YWwpCiAgICB7CiAgICAgICAgdXBkYXRlKHJ0eCxydHkseCx5LHZhbCxmYWxzZSk7CiAgICB9CiAKICAgIGludCBtYXhfcmFuZ2UoY29uc3QgaW50ICZ4MSxjb25zdCBpbnQgJnkxLGNvbnN0IGludCAmeDIsY29uc3QgaW50ICZ5MikKICAgIHsKICAgICAgICByZXR1cm4gZ2V0KHJ0eCxydHkseDEseTEseDIseTIpOwogICAgfQp9OwppbnQgbWFpbigpCnsKICAgICNpZmRlZiBkbWRkCiAgICBmcmVvcGVuKHRhZyIuaW5wIiwiciIsc3RkaW4pOyBmcmVvcGVuKHRhZyIub3V0IiwidyIsc3Rkb3V0KTsKICAgICNlbmRpZiAvLyBkbWRkCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKIAogCiAgICBpbnQgbixrOwogICAgY2luPj5uPj5rOwogICAgdmVjdG9yPGludD4geChuKzEpLHkobisxKSx6KG4rMSk7CiAKICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKSBjaW4+PnhbaV0+PnlbaV0+PnpbaV07CiAKICAgIGl0MkQgc3QoMiptYXhuLDIqbWF4bik7CiAKICAgICNkZWZpbmUga3JhbmdlKHgseSkgeCt5LWsseC15LWsrbWF4bix4K3krayx4LXkrayttYXhuCiAgICBmb3IoaW50IGk9bixjdXI7aT49MTtpLS0pCiAgICB7CiAgICAgICAgY3VyPXN0Lm1heF9yYW5nZShrcmFuZ2UoeFtpXSx5W2ldKSkgKyB6W2ldOwogCiAgICAgICAgc3QudXBkYXRlKHhbaV0reVtpXSx4W2ldLXlbaV0rbWF4bixjdXIpOwogICAgfQogCiAgICBjb3V0PDxzdC5tYXhfcmFuZ2Uoa3JhbmdlKDAsMCkpOwogCiAgICByZXR1cm4gMDsKfQ==