#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
#define task "text"
#define int long long
const int N = 1e5+5;
int n,m;
struct que{
int t,l,r,c;
}query[N];
struct segtree{
//stmax
pair<int,int> st[4*N];
void build(int id,int l,int r){
st[id]={-9e17,0};
if(l==r) return;
int mid=(l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
}
void update(int id,int l,int r,int p,pair<int,int> val){
if(l==r){
st[id]=val;
return;
}
int mid=(l+r)>>1;
if(mid<p) update(id<<1|1,mid+1,r,p,val);
else update(id<<1,l,mid,p,val);
st[id]=max(st[id<<1],st[id<<1|1]);
}
pair<int,int> get(int id,int l,int r,int u,int v){
if(r<u || v<l) return make_pair(-9e17,0);
if(u<=l && r<=v) return st[id];
int mid=(l+r)>>1;
return max(get(id<<1,l,mid,u,v),get(id<<1|1,mid+1,r,u,v));
}
}stl,str;
int dist[N];
int arr[N];
signed main(){
ios::sync_with_stdio(false);cin.tie(nullptr);
if(fopen(task".inp","r")){
freopen(task".inp","r",stdin);
}
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>query[i].t>>query[i].l>>query[i].r>>query[i].c;
arr[i]=query[i].t;
}
sort(query+1,query+1+m,[&](que a,que b){
return a.t < b.t;
});
sort(arr+1,arr+1+m);
for(int i=1;i<=m;i++) dist[i]=9e17;
stl.build(1,1,m);
str.build(1,1,m);
for(int i=1;i<=m;i++){
str.update(1,1,m,i,make_pair(-(query[i].l+query[i].t),i));
stl.update(1,1,m,i,make_pair(-(query[i].l-query[i].t),i));
}
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
for(int i=1;i<=m;i++){
if(query[i].l == 1){
dist[i]=query[i].c;
pq.push({dist[i],i});
//cerr<<i<<' '<<dist[i]<<'\n';
stl.update(1,1,m,i,make_pair(-9e17,0));
str.update(1,1,m,i,make_pair(-9e17,0));
}
}
//cerr<<query[1].t<<'\n';
while(!pq.empty()){
int i=pq.top().se;
int dis=pq.top().fi;
pq.pop();
if(dist[i] != dis) continue;
int l=lower_bound(arr+1,arr+1+m,query[i].t)-arr;
while(1){
pair<int,int> x=stl.get(1,1,m,l,m);
if(x.se == 0) break;
int j=x.se;
if(query[i].r+query[i].t+1 >= query[j].l+query[j].t){
//cerr<<i<<' '<<j<<'\n';
stl.update(1,1,m,j,make_pair(-9e17,0));
str.update(1,1,m,j,make_pair(-9e17,0));
dist[j]=dist[i]+query[j].c;
pq.push({dist[j],j});
}else break;
}
while(l-1>=1){
pair<int,int> x=str.get(1,1,m,1,l-1);
if(x.se == 0) break;
int j=x.se;
if(query[i].r-query[i].t+1 >= query[j].l-query[j].t){
//cerr<<i<<' '<<j<<'\n';
stl.update(1,1,m,j,make_pair(-9e17,0));
str.update(1,1,m,j,make_pair(-9e17,0));
dist[j]=dist[i]+query[j].c;
pq.push({dist[j],j});
}else break;
}
}
int ans=9e17;
for(int i=1;i<=m;i++){
if(query[i].r == n){
ans=min(ans,dist[i]);
}
}
if(ans == 9e17) cout<<-1<<'\n';
else cout<<ans<<'\n';
}