#include <stdio.h>
#include <stdlib.h>

struct el
{
	int levo,desno,potrosnja;
};

el *A;
int n;
int *P,*Min;
int *V;
int levo,desno;
int m;
int br;
el *AA;
int nn;

void unos()
{
	FILE *f;
	f=fopen("svetiljke.in","r");
	fscanf(f,"%d%d%d",&n,&levo,&desno);
	A=(el *)malloc(n*sizeof(el));
	int i,br1,br2;
	for (i=0;i<n;i++)
	{
		fscanf(f,"%d%d%d",&br1,&br2,&A[i].potrosnja);
		A[i].levo=br1-br2;
		A[i].desno=br1+br2;
	}
	fclose(f);
}

void f1()
{
	int tren=0;
	while (tren<n)
	{
		if (A[tren].desno<=levo || A[tren].levo>=desno)
		{
			A[tren]=A[n-1];
			n--;
		}
		else
		{
			if (A[tren].levo<levo)
				A[tren].levo=levo;
			if (A[tren].desno>desno)
				A[tren].desno=desno;
			tren++;
		}
	}
}

void sort(el *A,int n)
{
	int pom=A[n/2].desno,levo=0,desno=n-1;
	while (levo<=desno)
	{
		while (A[levo].desno<pom)
			levo++;
		while (A[desno].desno>pom)
			desno--;
		if (levo<=desno)
		{
			el pom;
			pom=A[levo];
			A[levo]=A[desno];
			A[desno]=pom;
			levo++;
			desno--;
		}
	}
	if (desno>0)
		sort(A,desno+1);
	if (levo<n-1)
		sort(A+levo,n-levo);
}

void ispis(int broj)
{
	FILE *f=fopen("svetiljke.out","w");
	fprintf(f,"%d",broj);
	fclose(f);
}

int bp(int broj)
{
	int tren,levo=0,desno=m-1;
	
	while (true)
	{
		tren=(levo+desno)/2;
		if (P[tren]<broj)
			levo=tren+1;
		if (P[tren]>broj)
			desno=tren-1;
		if (P[tren]==broj)
			return tren;
		if (desno<levo)
			if (P[desno]<broj)
				return desno+1;
			else
				return desno;
	}
}

int mmin(int br1,int br2)
{
	if (br1<br2)
		return br1;
	else
		return br2;
}

void stablo(int m)
{
	br=1;
	while (br<m)
		br*=2;
	V=(int *)malloc((br*2-1)*sizeof(int));
	V[br-1]=0;
	int i;
	for (i=br;i<2*br-1;i++)
		V[i]=2000000000;

	for (i=br-2;i>=0;i--)
		V[i]=mmin(V[i*2+1],V[i*2+2]);
}

int najmanji(int levo,int desno)
{
	levo=br-1+levo;
	desno=br-1+desno;
	int broj=mmin(V[levo],V[desno]);
	int da_levo,da_desno;
	da_levo=levo%2;
	levo=(levo-1)/2;
	da_desno=(desno+1)%2;
	desno=(desno-1)/2;
	while (levo<desno)
	{
		if (da_levo)
			if (V[levo*2+2]<broj)
				broj=V[levo*2+2];
		if (da_desno)
			if (V[desno*2+1]<broj)
				broj=V[desno*2+1];
		da_levo=levo%2;
		levo=(levo-1)/2;
		da_desno=(desno+1)%2;
		desno=(desno-1)/2;
	}
	return broj;
}

void ubaci(int poz,int vred)
{
	V[br-1+poz]=vred;
	int tren=(br-1+poz-1)/2;
	while (tren>0)
	{
		V[tren]=mmin(V[tren*2+1],V[tren*2+2]);
		tren=(tren-1)/2;
	}
	V[0]=mmin(V[1],V[2]);
}

int main()
{
	unos();
	f1();	
	if (n==0)
	{
		ispis(-1);
		return 0;
	}
	if (n>1)
		sort(A,n);
	if (desno>A[n-1].desno)
	{
		ispis(-1);
		return 0;
	}
	
	int i;
	P=(int *)malloc((n+1)*sizeof(int));
	P[0]=levo;
	P[1]=A[0].desno;
	m=1;
	for (i=1;i<n;i++)
		if (A[i].desno>P[m])
		{
			m++;
			P[m]=A[i].desno;
		}
	m++;
	Min=(int *)malloc(m*sizeof(int));
	Min[0]=0;
	for (i=1;i<m;i++)
		Min[i]=2000000000;
	stablo(m);
	
	int tren=0;
	for (i=1;i<m;i++)
	{
		bool da=true;
		int broj=0;
		while (da)
		{
			broj++;
			if (tren==n)
				da=false;
			else
				if (A[tren].desno==P[i])
				{
					int br1,br2;
					br1=bp(A[tren].levo);
					br2=bp(A[tren].desno)-1;
					if (br1<=br2)
					{
						int br=najmanji(br1,br2);
						if (br+A[tren].potrosnja<Min[i])
							Min[i]=br+A[tren].potrosnja;
					}
					tren++;
				}
				else
				{
					ubaci(i,Min[i]);
					da=false;
				}
		}
	}
	if (Min[m-1]<2000000000)
		ispis(Min[m-1]);
	else
		ispis(-1);
	return 0;
}