# include <iostream>
# include <algorithm>
using namespace std;
typedef long long LL;
const int N = 10010 , M = 87000 ;
const LL INF = 1e18 ;
int n, m, e;
struct Range {
int l, r, w;
} range[ N] ;
struct Node {
int l, r;
LL v;
} tr[ M* 4 ] ;
bool cmp ( Range A, Range B) { return A. r< B. r; }
void pushup ( int u)
{
tr[ u] . v= min ( tr[ u<< 1 ] . v, tr[ u<< 1 | 1 ] . v) ;
}
void build ( int u, int l, int r)
{
tr[ u] = { l, r, INF} ;
if ( l== r) return ;
else
{
int mid= l+ r>> 1 ;
build ( u<< 1 , l, mid) ; build ( u<< 1 | 1 , mid+ 1 , r) ;
}
}
void update ( int u, int k, LL v)
{
if ( tr[ u] . l== tr[ u] . r)
{
tr[ u] . v= min ( tr[ u] . v, v) ;
return ;
}
else
{
int mid= tr[ u] . l+ tr[ u] . r>> 1 ;
if ( k<= mid) update ( u<< 1 , k, v) ;
else update ( u<< 1 | 1 , k, v) ;
pushup ( u) ;
}
}
LL query ( int u, int l, int r)
{
if ( tr[ u] . l>= l&& tr[ u] . r<= r) return tr[ u] . v;
else
{
int mid= tr[ u] . l+ tr[ u] . r>> 1 ;
LL res= INF;
if ( l<= mid) res= query ( u<< 1 , l, r) ;
if ( r> mid) res= min ( res, query ( u<< 1 | 1 , l, r) ) ;
return res;
}
}
int main ( )
{
cin>> n>> m>> e;
build ( 1 , m- 1 , e) ;
update ( 1 , m- 1 , 0 ) ;
for ( int i= 0 ; i< n; i++ ) cin>> range[ i] . l>> range[ i] . r>> range[ i] . w;
sort ( range, range+ n, cmp) ;
for ( int i= 0 ; i< n; i++ )
{
int l= range[ i] . l, r= range[ i] . r, w= range[ i] . w;
LL v= query ( 1 , l- 1 , r- 1 ) + w;
update ( 1 , r, v) ;
}
LL res= query ( 1 , e, e) ;
if ( res== INF) res= - 1 ;
cout<< res<< endl;
return 0 ;
}