#ifdef LOCAL
#include "/home/bgopc/template/pch.hpp"
#endif
#include <bits/stdc++.h>
using namespace std;
// * No One Dies a Virgin, Life Fucks Us All
typedef long long ll;
#define nl '\n'
#define ff first
#define ss second
#define pb push_back
#define sik(x) {cout << x << nl; return;}
constexpr ll maxn = 1e5+10, mod = 1e9 + 7, inf = 1e17, SQ = 450, LG = 20;
typedef pair<int, int> pii;
int n, m, A[maxn], B[maxn], C[maxn];
ll segl[(3 * maxn) << 2], segr[(3 * maxn) << 2], D[maxn];
vector<int> comp;
void build(int l, int r, int id) {
segl[id] = inf;
segr[id] = inf;
if (r - l == 1) return;
int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
build(l, mid, lc);
build(mid, r, rc);
}
void update(ll seg[], int p, ll x, int l = 1, int r = n+1, int id = 1) {
if (r - l == 1) return void (seg[id] = min(seg[id], x));
int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
if (p < mid) update(seg, p, x, l, mid, lc);
else update(seg, p, x, mid, r, rc);
seg[id] = min(seg[lc], seg[rc]);
}
ll get(ll seg[], int ql, int qr, int l = 1, int r = n+1, int id = 1) {
if (ql <= l && r <= qr) return seg[id];
if (qr <= l || r <= ql) return inf;
int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
return min(get(seg, ql, qr, l, mid, lc), get(seg, ql, qr, mid, r, rc));
}
int32_t main() {
cin.tie(0)->sync_with_stdio(0);
cin >> m >> n;
comp.pb(0);
comp.pb(1);
comp.pb(n);
for (int i = 1 ; i <= m ; i ++) {
cin >> A[i] >> B[i] >> C[i] >> D[i];
comp.pb(A[i]);
comp.pb(B[i]);
comp.pb(C[i]);
}
sort(comp.begin(), comp.end());
comp.resize(unique(comp.begin(), comp.end()) - comp.begin());
for (int i = 1 ; i <= m ; i ++) {
A[i] = lower_bound(comp.begin(), comp.end(), A[i]) - comp.begin();
B[i] = lower_bound(comp.begin(), comp.end(), B[i]) - comp.begin();
C[i] = lower_bound(comp.begin(), comp.end(), C[i]) - comp.begin();
}
n = comp.size() - 1;
build(1, n + 1, 1);
ll ans = inf;
for (int i = 1 ; i <= m ; i ++) {
ll dpl = get(segl, A[i], B[i] + 1) + D[i];
ll dpr = get(segr, A[i], B[i] + 1) + D[i];
if (A[i] == 1) dpl = min(dpl, D[i]);
if (B[i] == n) dpr = min(dpr, D[i]);
if (A[i] == 1 && B[i] == n) ans = min(ans, D[i]);
ans = min(ans, dpl + get(segr, A[i], B[i] + 1));
ans = min(ans, dpr + get(segl, A[i], B[i] + 1));
update(segl, C[i], dpl);
update(segr, C[i], dpr);
}
cout << (ans >= inf ? -1 : ans) << nl;
}