#include<bits/stdc++.h>
#define il inline
#define get getchar
#define put putchar
#define is isdigit
#define re register
#define int long long
#define dfor(i,a,b) for(re int i=a;i<=b;++i)
#define dforr(i,a,b) for(re int i=a;i>=b;--i)
#define dforn(i,a,b) for(re int i=a;i<=b;++i,put(10))
#define mem(a,b) memset(a,b,sizeof a)
#define memc(a,b) memcpy(a,b,sizeof a)
#define pr 114514191981
#define gg(a) cout<<a,put(32)
#define INF 0x7fffffff
#define tt(x) cout<<x<<'\n'
#define ls i<<1
#define rs i<<1|1
#define lowbit(x) (x&-x)
using namespace std;
typedef unsigned int ull;
const int N=1e5+10,M=2e3+10,mod=19650827;
int read(void)
{
re int x=0,f=1;re char c=get();
while(!is(c)) (f=c==45?-1:1),c=get();
while(is(c)) x=(x<<1)+(x<<3)+(c^48),c=get();
return x*f;
}
void write(int x)
{
if(x<0) x=-x,put(45);
if(x>9) write(x/10);
put((x%10)^48);
}
#define writeln(a) write(a),put(10)
#define writesp(a) write(a),put(32)
int n,m,k,t,ans,f[4001][4001];
vector<int > ve;
signed main()
{
n=read(),m=read(),k=read(),t=read();
re int x,y,pre;
while(k--) x=read(),y=read(),f[x][y]=read(),ve.push_back(x);
sort(ve.begin(),ve.end());
ve.erase(unique(ve.begin(),ve.end()),ve.end());
pre=ve[0];
dfor(i,1,ve.size()-1)
{
deque<int > q;
re int pos=0;
dfor(j,1,m)
{
while(!q.empty()&&j-t>q.front()) q.pop_front();
while(pos+1<=m&&pos+1<=j+t)
{
++pos;
if(!f[pre][pos]) continue;
while(!q.empty()&&f[pre][q.back()]<=f[pre][pos]) q.pop_back();
q.push_back(pos);
}
if(!q.empty()) ans=max(ans,f[ve[i]][j]+=f[pre][q.front()]);
}
pre=ve[i];
}
write(ans);
return 0;
}