#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<set>
using namespace std;
struct node{
long long x,y;
}__,w[2000003],p[2000003],_[2000003];
long long n,m,l,r,t,lo,ans,sum,s,i,j,k;
bool cmp(node a,node b)
{
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int main()
{
for(scanf("%lld%lld",&n,&m),i=1;i<=m;i++) scanf("%lld%lld",&w[i].x,&w[i].y);
sort(w+1,w+m+1,cmp),t=1,p[1].x=1,p[1].y=1;
for(i=1;i<=m;)
{
j=i,sum=0;
while(w[i].x==w[j+1].x&&j<m) j++;
if(w[i].x-lo>1) t=1,p[1].y=n;
for(s=0,k=i;k<=j;k++)
{
if(w[k].y==s+1)
{
s=w[k].y;
continue;
}
l=1,r=t,ans=-1,__.x=1e10,__.y=w[k].y;
while(l<=r)
{
if(p[(l+r)/2].y>s) ans=(l+r)/2,r=(l+r)/2-1;
else l=(l+r)/2+1;
}
if(ans!=-1&&p[ans].y<w[k].y) __.x=min(__.x,max(p[ans].x,s+1));
l=1,r=t,ans=-1;
while(l<=r)
{
if(p[(l+r)/2].x>s) ans=(l+r)/2,r=(l+r)/2-1;
else l=(l+r)/2+1;
}
if(ans!=-1&&p[ans].x<w[k].y) __.x=min(__.x,p[ans].x);
s=__.y;
if(__.x!=1e10) __.y--,_[++sum]=__;
}
if(s<n)
{
l=1,r=t,ans=-1,__.x=1e10,__.y=n;
while(l<=r)
{
if(p[(l+r)/2].y>s) ans=(l+r)/2,r=(l+r)/2-1;
else l=(l+r)/2+1;
}
if(ans!=-1&&p[ans].y<=n) __.x=min(__.x,max(p[ans].x,s+1));
l=1,r=t,ans=-1;
while(l<=r)
{
if(p[(l+r)/2].x>s) ans=(l+r)/2,r=(l+r)/2-1;
else l=(l+r)/2+1;
}
if(ans!=-1&&p[ans].x<=n) __.x=min(__.x,p[ans].x);
if(__.x!=1e10) _[++sum]=__;
}
for(t=sum,k=1;k<=t;k++) p[k]=_[k];
if(t==0) return printf("-1"),0;
lo=w[i].x,i=j+1;
}
if(lo!=n) return printf("%lld",n*2-2),0;
if(p[t].y==n) return printf("%lld",n*2-2),0;
return printf("-1"),0;
}