#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5050;
int a[N][N]; // 开两个数组会内存超限
int main()
{
int n,r;
cin >> n >> r;
r=min(5001,r); // 地图最多5000*5000,下面横纵坐标都加1,所以和5001作比较
int maxx=r,maxy=r;
for(int i=1;i<=n;++i)
{
int x,y,w;
cin >> x >> y >> w;
++x,++y; // 横纵坐标都加1,方便前缀和从 1 1 开始计算
maxx=max(maxx,x);
maxy=max(maxy,y);
a[x][y]+=w; // 不同目标可能在同一位置,此时a为该位置价值总和
}
for(int i=1;i<=maxx;++i)
{
for(int j=1;j<=maxy;++j)
{
a[i][j]=a[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1]; // =前的a[i][j]更新为前缀和数组,=后的a[i][j]为该位置价值总和
}
}
int ans=-1;
for(int i=r;i<=maxx;++i)
{
for(int j=r;j<=maxy;++j)
{
ans=max(ans,a[i][j]-a[i-r][j]-a[i][j-r]+a[i-r][j-r]); // r*r范围的前缀和
}
}
cout << ans << endl;
return 0;
}