#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}()); 
const ll mod=1000000007;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head

const int N=201000;
const ll inf=1ll<<60;
int n,m;
VI seg[N];
ll x,y;
ll dp[N],ans;
VI vl;

struct rangeset {
	ll nd[4*N],v;
	void build(int p,int l,int r) {
		nd[p]=-inf;
		if (l==r) {
		} else {
			int md=(l+r)>>1;
			build(p+p,l,md);
			build(p+p+1,md+1,r);
		}
	}
	void query(int p,int l,int r,int tl,int tr) {
		v=max(v,nd[p]);
		if (tl==l&&tr==r) return;
		else {
			int md=(l+r)>>1;
			if (tr<=md) query(p+p,l,md,tl,tr);
			else if (tl>md) query(p+p+1,md+1,r,tl,tr);
			else query(p+p,l,md,tl,md),query(p+p+1,md+1,r,md+1,tr);
		}
	}
	void modify(int p,int l,int r,int tl,int tr,ll v) {
		if (tl>tr) return;
		if (tl==l&&tr==r) nd[p]=max(nd[p],v);
		else {
			int md=(l+r)>>1;
			if (tr<=md) modify(p+p,l,md,tl,tr,v);
			else if (tl>md) modify(p+p+1,md+1,r,tl,tr,v);
			else modify(p+p,l,md,tl,md,v),modify(p+p+1,md+1,r,md+1,tr,v);
		}
	}

	void init() {
		build(1,1,m);
	}
	ll query(int y) {
		v=-inf;
		int id=lower_bound(all(vl),y)-vl.begin()+1;
		assert(vl[id-1]==y);
		query(1,1,m,id,id);
	//	printf("ff %d %lld\n",y,v);
		return v;
	}
	void add(int l,int r,ll v) {
		int fl=lower_bound(all(vl),l)-vl.begin()+1;
		int fr=upper_bound(all(vl),r)-vl.begin();
	//	printf("gg %d %d %d %d %lld\n",l,r,fl,fr,v);
		if (fl<=fr) modify(1,1,m,fl,fr,v);
	}
}p1,cols[10],cold[10];

int main() {
	scanf("%*d%d%lld%lld",&n,&x,&y); rep(i,0,n) {
		int c,l,r;
		scanf("%d%d%d",&c,&l,&r);
		--c;
		seg[i]=VI{r,l,c};
		vl.pb(l);
	}
	sort(seg,seg+n);
	sort(all(vl));
	vl.erase(unique(all(vl)),vl.end());
	m=SZ(vl);
	//for (auto x:vl) printf("%d ",x); puts("");
	p1.init();
	rep(k,0,3) cols[k].init(),cold[k].init();
	rep(j,0,n) {

		dp[j]=0;
		dp[j]=max(dp[j],p1.query(seg[j][1]));
		dp[j]=max(dp[j],cols[seg[j][2]].query(seg[j][1])+x*seg[j][1]);
		rep(k,0,3) if (seg[j][2]!=k) dp[j]=max(dp[j],cold[k].query(seg[j][1])+(2*x+y)*seg[j][1]);
		
		dp[j]+=(seg[j][0]-seg[j][1]+1)*x;
		ans=max(ans,dp[j]);
		//printf("%d %lld\n",j,dp[j]);
		p1.add(seg[j][0]+1,1<<30,dp[j]);
		cols[seg[j][2]].add(seg[j][1]+1,seg[j][0],dp[j]-x*(seg[j][0]+1));
		cold[seg[j][2]].add(seg[j][1]+1,seg[j][0],dp[j]-(2*x+y)*(seg[j][0]+1));
/*
		rep(i,j+1,n) {
			// seg[j][0]+1 .... inf
			if (seg[j][1]<seg[i][1]&&seg[j][0]<seg[i][1]) dp[i]=max(dp[i],dp[j]);
			// seg[j][1]+1 ... seg[j][0]
			if (seg[j][2]==seg[i][2]&&seg[j][0]>=seg[i][1]&&seg[j][1]<seg[i][1])
				dp[i]=max(dp[i],dp[j]-x*(seg[j][0]-seg[i][1]+1));
			// seg[j][1]+1 ... seg[j][0]
			if (seg[j][2]!=seg[i][2]&&seg[j][0]>=seg[i][1]&&seg[j][1]<seg[i][1])
				dp[i]=max(dp[i],dp[j]-(2*x+y)*(seg[j][0]-seg[i][1]+1));
		}*/
		//printf("%d %lld %d\n",i,dp[i],pre);
	}
	printf("%lld\n",ans);
}



Measured memory_bytes: 44900