#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
ll t,n,m,dis[200005],head[200005],k,cnt[200005],ans;
bool vis[200005];
struct edge{
int v,w,next;
}e[500005];
void add(int u,int v,int w){
e[++k]={v,w,head[u]};
head[u]=k;
}
ll spfa(int s){
deque<int>q;
dis[s]=0;
q.push_back(s);
while(!q.empty()){
int u=q.front();
q.pop_front();
vis[u]=0;
for(int i=head[u];i;i=e[i].next){
if(dis[e[i].v]>dis[u]+e[i].w){
dis[e[i].v]=dis[u]+e[i].w;
if(!vis[e[i].v]){
vis[e[i].v]=1;
if(q.size()&&dis[e[i].v]>dis[q.front()])q.push_back(e[i].v);
else q.push_front(e[i].v);
if(++cnt[e[i].v]>n)return -1;
}
}
}
}
return dis[n];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
k=0;
memset(dis,0x3f,sizeof dis);
for(int i=1;i<=n;++i)add(i,i-1,0),add(i-1,i,1);
for(int i=1;i<=m;++i){
int u,v;
cin >> u >> v;
add(u-1,v,1),add(v,u-1,-1);
}
cout << spfa(0) << endl;
return 0;
}
评测寄录