#define _USE_MATH_DEFIMES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const int MOD = 1'000'000'007; const int MOD2 = 998'244'353; const int INF = 1'000'000'000; //1e9 const int NIL = -1; const long long LINF = 1'000'000'000'000'000'000; // 1e18 const long double EPS = 1E-10L; template inline bool chmax(T &a, const S &b){ if(a < b){a = b; return true;} return false; } template inline bool chmin(T &a, const S &b){ if(b < a){a = b; return true;} return false; } template inline bool exist(Container &s, const T &e){ return (s.find(e) != std::end(s)); } template inline bool inside(T x, T lx, T rx){ return (std::clamp(x, lx, rx) == x); } template inline bool inside(T x, T y, T lx, T rx, T ly, T ry){ return inside(x, lx, rx) && inside(y, ly, ry); } void dijkstraWithoutCost(int s, std::vector> &G, std::vector &d, std::vector &prv){ //pair first: 距離 second: 頂点 std::priority_queue, std::vector>, std::greater>> que; int V{int(G.size())}; d.resize(V, LINF+3); prv.resize(V, NIL); d[s] = 0; que.emplace(0, s); while(!que.empty()){ std::pair p{que.top()}; que.pop(); int v{p.second}; if(d[v] < p.first) continue; for(int &u: G[v]){ if(d[u] > d[v] + 1){ d[u] = d[v] + 1; prv[u] = v; que.emplace(d[u], u); } } } } int main(){ int N, M; std::cin >> N >> M; std::vector> G(N); { int a, b; for(int i{0}; i < M; ++i){ std::cin >> a >> b; --a; --b; G[a].push_back(b); G[b].push_back(a); } } std::vector d; std::vector prv; dijkstraWithoutCost(0, G, d, prv); std::cout << (d[N-1] <= N ? d[N-1] : -1) << std::endl; return 0; }