#include #include #define chmin(x,y) (x) = min((x),(y)) #define chmax(x,y) (x) = max((x),(y)) #define ld long double using namespace std; using namespace atcoder; using ll = long long; const ll mod = 998244353; using mint = modint998244353; using Graph = vector>; const vector dx = {1,0,-1,0}, dy = {0,1,0,-1}; int main(){ int N,M; cin >> N >> M; Graph G(N); while(M--){ int u,v; cin >> u >> v; G[--u].push_back(--v); } // solve: BFS int ans = -1; queue> q; vector> d(N,vector(4,2e9)); q.push({0,0,0}); d[0][0] = 0; while(!q.empty() && ans == -1){ vector v = q.front(); int cur = v[0], dist = v[1], visit = v[2]; q.pop(); if(cur == 0 && visit == 3) ans = dist; else for (auto nxt : G[cur]){ int visit_new = visit; if(nxt == N-2) visit_new |= 2; if(nxt == N-1) visit_new |= 1; if(d[nxt][visit_new] > dist + 1){ q.push({nxt,dist+1,visit_new}); d[nxt][visit_new] = dist + 1; } } } // output cout << ans << endl; }