#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int maxl=1e5+10,INF=1e9+7;
struct ball{
int h,l,r,id;
}a[maxl],c[maxl];
struct lisan{
int val,id;
}b[maxl];
struct node{
int l,r,data,tag;
}tree[8*maxl];
int n,hh,sx,sy,cnt,vis[maxl],pre[maxl][3],dp[maxl][3];
int cmp1(lisan a,lisan b){
return a.val<b.val;
}
int cmp2(ball a,ball b){
return a.h<b.h;
}
void pushdown(int p,int ls,int rs){
if(tree[p].tag){
tree[ls].data=tree[p].tag;
tree[rs].data=tree[p].tag;
tree[ls].tag=tree[p].tag;
tree[rs].tag=tree[p].tag;
tree[p].tag=0;
}
}
void build_tree(int p,int ld,int rd){
tree[p]={ld,rd,0,0};
if(ld==rd){
tree[p].data=0;
return;
}
int mid=ld+rd>>1;
int ls=p<<1,rs=p<<1|1;
build_tree(ls,ld,mid);
build_tree(rs,mid+1,rd);
}
void update(int p,int ql,int qr,int k){
if(ql<=tree[p].l&&qr>=tree[p].r){
tree[p].data=k;
tree[p].tag=k;
return;
}
int mid=tree[p].l+tree[p].r>>1;
int ls=p<<1,rs=p<<1|1;
pushdown(p,ls,rs);
if(ql<=mid)update(ls,ql,qr,k);
if(qr>mid)update(rs,ql,qr,k);
}
int query(int p,int x){
if(tree[p].l==tree[p].r)return tree[p].data;
int mid=tree[p].l+tree[p].r>>1;
int ls=p<<1,rs=p<<1|1;
pushdown(p,ls,rs);
int res=0;
if(x<=mid)return query(ls,x);
if(x>mid)return query(rs,x);
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>hh>>sx>>sy;
memset(dp,INF,sizeof(dp));
for(int i=1;i<=n;i++){
cin>>a[i].h>>a[i].l>>a[i].r;
c[i].h=a[i].h;
c[i].l=a[i].l;
c[i].r=a[i].r;
a[i].id=i;
b[cnt+1].id=b[cnt+2].id=i;
b[++cnt].val=a[i].l;
b[++cnt].val=a[i].r;
}
a[n+1].id=n+1;
c[n+1].h=a[n+1].h=sy;
c[n+1].l=c[n+1].r=a[n+1].l=a[n+1].r=sx;
b[cnt+1].id=n+1;
b[++cnt].val=sx;
sort(b+1,b+1+cnt,cmp1);
int idx;
for(int i=1;i<=cnt;i++){
idx=i;
if(!vis[b[i].id]){
a[b[i].id].l=idx;
if(b[i].id==n+1)a[b[i].id].r=idx;
vis[b[i].id]=1;
}
else a[b[i].id].r=idx;
}
sort(a+1,a+1+n,cmp2);
build_tree(1,1,cnt);
for(int i=1;i<=n+1;i++){
pre[i][0]=query(1,a[i].l);
pre[i][1]=query(1,a[i].r);
update(1,a[i].l,a[i].r,i);
}
int flag=0;
for(int i=n+1;i>=1;i--){
if(a[i].id!=n+1&&flag==0)continue;
else flag=1;
if(a[i].id==n+1)dp[i][0]=dp[i][1]=0;
if(a[i].h-a[pre[i][0]].h<=hh){
int idx1=a[i].id,idx2=a[pre[i][0]].id;
if(pre[i][0]==0)c[idx2].l=c[idx2].r=c[idx1].l;
dp[pre[i][0]][0]=min(dp[pre[i][0]][0],dp[i][0]+abs(c[idx1].l-c[idx2].l));
dp[pre[i][0]][1]=min(dp[pre[i][0]][1],dp[i][0]+abs(c[idx1].l-c[idx2].r));
}
if(a[i].h-a[pre[i][1]].h<=hh){
int idx1=a[i].id,idx2=a[pre[i][1]].id;
if(pre[i][1]==0)c[idx2].l=c[idx2].r=c[idx1].r;
dp[pre[i][1]][0]=min(dp[pre[i][1]][0],dp[i][1]+abs(c[idx1].r-c[idx2].l));
dp[pre[i][1]][1]=min(dp[pre[i][1]][1],dp[i][1]+abs(c[idx1].r-c[idx2].r));
}
}
cout<<min(dp[0][0],dp[0][1])+sy<<'\n';
return 0;
}