// 0-1 bfs
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pairs;
vector<pairs> vec[100001]; // vector representing single directed edges
int nodes,edges;
int dis[100001];
void frak(){
for(int i = 0;i<=nodes;i++){
dis[i] = INT_MAX; // initialising all distances from node 1
}
}
int main(){
scanf("%d%d",&nodes,&edges);
frak();
int a,b;
for(int i = 0;i<edges;i++){
scanf("%d%d",&a,&b);
vec[a].push_back(make_pair(0,b)); // the direct edge given has weight 0
vec[b].push_back(make_pair(1,a)); // the extra edge (reverse) is marked as weight 1
}
deque<int> q; // deque(double ended queue) initialsed
q.push_back(1); // insert the node 1 in the deque
dis[1] = 0;
while(!q.empty()){
int no = q.front();
q.pop_front();
if(no==nodes) // if the node at front of deque is nodes so break
break;
for(int i = 0;i<vec[no].size();i++){ // scan the adjacency list connected to that element(no)
int el= vec[no][i].second;
int w = vec[no][i].first;
if(dis[el]>dis[no]+w){ // condition same as dijkstra's
dis[el] = dis[no]+w; // update the distance of the connected node(el)
if(w==1){ // if we have to go through a reverse edge then add it to the back of the deque(it will be accessed late than edges having 0 weight
q.push_back(el);
}
else{ // if there is a direct edge then add that node to front of dequeue as it will be accessed first
q.push_front(el);
}
}
}
}
if(dis[nodes]==INT_MAX){
cout<<"-1"<<endl;
}
else{
cout<<dis[nodes]<<endl;
}
}
Ly8gMC0xICBiZnMKIAojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8aW50LGludD4gcGFpcnM7CiAKdmVjdG9yPHBhaXJzPiB2ZWNbMTAwMDAxXTsgICAgICAgICAvLyAgdmVjdG9yIHJlcHJlc2VudGluZyBzaW5nbGUgZGlyZWN0ZWQgZWRnZXMKIAppbnQgbm9kZXMsZWRnZXM7CmludCBkaXNbMTAwMDAxXTsKIAp2b2lkIGZyYWsoKXsKCWZvcihpbnQgaSA9IDA7aTw9bm9kZXM7aSsrKXsKCQlkaXNbaV0gPSBJTlRfTUFYOyAgICAgICAgICAgICAgLy8gaW5pdGlhbGlzaW5nIGFsbCBkaXN0YW5jZXMgZnJvbSBub2RlIDEgCgl9Cn0KIAppbnQgbWFpbigpewoJCglzY2FuZigiJWQlZCIsJm5vZGVzLCZlZGdlcyk7ICAgICAgICAgCglmcmFrKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJaW50IGEsYjsKCWZvcihpbnQgaSA9IDA7aTxlZGdlcztpKyspewoJCXNjYW5mKCIlZCVkIiwmYSwmYik7CgkJdmVjW2FdLnB1c2hfYmFjayhtYWtlX3BhaXIoMCxiKSk7ICAgICAgICAgIC8vIHRoZSBkaXJlY3QgZWRnZSBnaXZlbiAgaGFzIHdlaWdodCAwCgkJdmVjW2JdLnB1c2hfYmFjayhtYWtlX3BhaXIoMSxhKSk7ICAgICAgICAgIC8vIHRoZSBleHRyYSBlZGdlIChyZXZlcnNlKSBpcyBtYXJrZWQgYXMgd2VpZ2h0IDEKCX0KCQoJZGVxdWU8aW50PiBxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVxdWUoZG91YmxlIGVuZGVkIHF1ZXVlKSBpbml0aWFsc2VkCglxLnB1c2hfYmFjaygxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgbm9kZSAxIGluIHRoZSBkZXF1ZQoJZGlzWzFdID0gMDsKCQoJd2hpbGUoIXEuZW1wdHkoKSl7CgkJaW50IG5vID0gcS5mcm9udCgpOwoJCQoJCXEucG9wX2Zyb250KCk7CgkJaWYobm89PW5vZGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbm9kZSBhdCBmcm9udCBvZiBkZXF1ZSBpcyBub2RlcyBzbyBicmVhawoJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCWZvcihpbnQgaSA9IDA7aTx2ZWNbbm9dLnNpemUoKTtpKyspeyAgICAgIC8vIHNjYW4gdGhlIGFkamFjZW5jeSBsaXN0IGNvbm5lY3RlZCB0byB0aGF0IGVsZW1lbnQobm8pCgkJCQoJCQlpbnQgZWw9ICB2ZWNbbm9dW2ldLnNlY29uZDsKCQkJaW50IHcgPSAgdmVjW25vXVtpXS5maXJzdDsKCQkJCgkJCWlmKGRpc1tlbF0+ZGlzW25vXSt3KXsgICAgICAgICAgICAgIC8vIGNvbmRpdGlvbiBzYW1lIGFzIGRpamtzdHJhJ3MKCQkJCWRpc1tlbF0gPSBkaXNbbm9dK3c7ICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGRpc3RhbmNlIG9mIHRoZSBjb25uZWN0ZWQgbm9kZShlbCkKCQkJCQoJCQkJaWYodz09MSl7ICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIGEgcmV2ZXJzZSBlZGdlIHRoZW4gYWRkIGl0IHRvIHRoZSBiYWNrIG9mIHRoZSBkZXF1ZShpdCB3aWxsIGJlIGFjY2Vzc2VkIGxhdGUgdGhhbiBlZGdlcyBoYXZpbmcgMCB3ZWlnaHQKCQkJCQoJCQkJCXEucHVzaF9iYWNrKGVsKTsgICAgICAgICAgICAgICAgIAoJCQl9CgkJCQllbHNleyAgICAgICAgICAgICAgICAgICAgLy8gIGlmIHRoZXJlIGlzIGEgZGlyZWN0IGVkZ2UgdGhlbiBhZGQgdGhhdCBub2RlIHRvIGZyb250IG9mIGRlcXVldWUgYXMgaXQgd2lsbCBiZSBhY2Nlc3NlZCBmaXJzdCAKCQkJCgkJCQlxLnB1c2hfZnJvbnQoZWwpOwoJCQl9CgkJCX0JCgkJfQkKCX0KCWlmKGRpc1tub2Rlc109PUlOVF9NQVgpewoJCWNvdXQ8PCItMSI8PGVuZGw7Cgl9CgllbHNlewoJCWNvdXQ8PGRpc1tub2Rlc108PGVuZGw7Cgl9CgkKfQ==