#include using namespace std; #define rep(i, s, n) for (int i = (s); i < (int)(n); i++) #include using namespace atcoder; using mint1 = modint1000000007; using mint2 = modint998244353; using ll = long long; using ull = unsigned long long; using ld = long double; ld pi=3.141592653589793; const int inf=2e9; const ll linf=2e18; const ld eps=1e-14; #define Yes cout << "Yes" << endl #define No cout << "No" << endl int main() { ll n,m; cin >> n >> m; vector> G(n); for(ll i=0; i> u >> v; u--,v--; G[u].push_back(v); } vector dist(n,-1); dist[0]=0; queue que; que.push(0); while(!que.empty()) { ll v=que.front(); que.pop(); for(auto nv:G[v]) { if(dist[nv]!=-1) { continue; }else { dist[nv]=dist[v]+1; que.push(nv); } } } vector dist2(n,-1); dist2[n-1]=0; que.push(n-1); while(!que.empty()) { ll v=que.front(); que.pop(); for(auto nv:G[v]) { if(dist2[nv]!=-1) { continue; }else { dist2[nv]=dist2[v]+1; que.push(nv); } } } vector dist3(n,-1); dist3[n-2]=0; que.push(n-2); while(!que.empty()) { ll v=que.front(); que.pop(); for(auto nv:G[v]) { if(dist3[nv]!=-1) { continue; }else { dist3[nv]=dist3[v]+1; que.push(nv); } } } ll ans=linf; if(dist[n-2]!=-1 && dist3[n-1]!=-1 && dist2[0]!=-1) { ans=min(dist[n-2]+dist3[n-1]+dist2[0],ans); } if(dist[n-1]!=-1 && dist2[n-2]!=-1 && dist3[0]!=-1) { ans=min(dist[n-1]+dist2[n-2]+dist3[0],ans); } if(dist[n-1]!=-1 && dist2[n-2]!=-1 && dist3[n-1]!=-1 && dist2[0]!=-1) { ans=min(dist[n-1]+dist2[n-2]+dist3[n-1]+dist2[0],ans); } if(dist[n-2]!=-1 && dist3[n-1]!=-1 && dist2[n-2]!=-1 && dist3[0]!=-1) { ans=min(dist[n-2]+dist3[n-1]+dist2[n-2]+dist3[0],ans); } if(ans==linf) { cout << -1 << endl; }else { cout << ans << endl; } }