- #include <bits/stdc++.h> 
- using namespace std; 
-   
-   
- //COPY THE BLACKBOX, there is no need to change anything in it. 
- //Check the main function at bottom for USAGE 
-   
- //****************BLACKBOX START***************** 
- //START COPYING FROM HERE 
-   
- typedef int ll; 
-   
- class Hash { 
-   public: 
-   	static int hash(int x){ 
-   		return hash({0,0,x}); 
-   	} 
-   	static int hash(tuple<int,int>x){ 
-   		return hash({0,get<0>(x),get<1>(x)}); 
-   	} 
-   	static int hash(tuple<int,int,int>x){ 
-   		int k=get<0>(x),u=get<1>(x),v=get<2>(x); 
-   		return k*1873*1873 + u*1873 + v; 
-   	} 
- }; 
-   
- class Graph { 
-   
- 	bool is_directed; 
-   
- 	public: 
- 		vector<vector<pair<int,ll>>>adj; 
-     int n,N=2000000; 
-   
- 		Graph(int n_, bool is_directed_){ 
- 			n=n_; is_directed = is_directed_; 
- 			adj.resize(N,vector<pair<int,ll>>()); 
- 		} 
-   
- 		int hash(int u, int v){ 
- 			return Hash::hash({u,v}); 
- 		} 
- 		int hash(int u, int v, int k){ 
- 			return Hash::hash({u,v,k}); 
- 		} 
-   
- 		void add_edge(int uR, int vR, ll c=0){ 
- 		  int u=Hash::hash(uR), v=Hash::hash(vR); 
- 		  add_edge_internal(u,v,c); 
- 		} 
- 		void add_edge(tuple<int,int> uR, tuple<int,int> vR, ll c=0){ 
- 		  int u=Hash::hash(uR), v=Hash::hash(vR); 
- 		  add_edge_internal(u,v,c); 
- 		} 
- 			void add_edge(tuple<int,int,int> uR, tuple<int,int,int> vR, ll c=0){ 
- 		  int u=Hash::hash(uR), v=Hash::hash(vR); 
- 		  add_edge_internal(u,v,c); 
- 		} 
-   
-   
- 	private : 
-   
- 	  void add_edge_internal(int u, int v, ll c=0){ 
- 			add_edge_weighted_undirected(u,v,c); 
- 			if(!is_directed) 
- 				add_edge_weighted_undirected(v,u,c); 
- 		} 
- 		void add_edge_weighted_undirected(int u, int v, ll c) { 
- 			pair<int,ll>p = make_pair(v,c); 
- 			adj[u].push_back(p); 
- 		} 
-   
- }; 
-   
- class BFS {  
-     vector<ll>min_dist_from_source; 
-     vector<bool> visited; 
-     Graph *g; 
-   
-     public: 
-       BFS(Graph *g_) { 
-           g = g_; 
-           clear(); 
-       } 
-   
- 	  	void clear() { 
-   			min_dist_from_source.clear(); 
-   			min_dist_from_source.resize(g->N,-1); 
-   			visited.clear(); 
-   			visited.resize(g->N, false); 
-   		} 
-   
-   
-       void run(int sourceR) { 
-         int source = Hash::hash(sourceR); 
-         run_internal(source); 
-       } 
-       void run(tuple<int,int> sourceR) { 
-         int source = Hash::hash(sourceR); 
-         run_internal(source); 
-       } 
-       void run(tuple<int,int,int> sourceR) { 
-         int source = Hash::hash(sourceR); 
-         run_internal(source); 
-       } 
-   
-   
-       int min_dist(int targetR){ 
-       	int target = Hash::hash(targetR); 
-       	return min_dist_internal(target); 
-       } 
-       int min_dist(tuple<int,int> targetR){ 
-       	int target = Hash::hash(targetR); 
-       	return min_dist_internal(target); 
-       } 
-       int min_dist(tuple<int,int,int> targetR){ 
-       	int target = Hash::hash(targetR); 
-       	return min_dist_internal(target); 
-       } 
-   
-       bool is_visited(int targetR){ 
-       	int target = Hash::hash(targetR); 
-       	return is_visited_internal(target); 
-       } 
-       bool is_visited(tuple<int,int> targetR){ 
-       	int target = Hash::hash(targetR); 
-       	return is_visited_internal(target); 
-       } 
-       bool is_visited(tuple<int,int,int> targetR){ 
-       	int target = Hash::hash(targetR); 
-       	return is_visited_internal(target); 
-       } 
-   
-   private: 
-     void run_internal(int source) { 
- 			queue<int> q; 
- 			q.push(source); 
-   
- 			visited[source] = true; 
- 			min_dist_from_source[source] = 0; 
-   
- 			while(!q.empty()) { 
- 				int cur_node = q.front(); 
- 				for (unsigned int i = 0; i < (g->adj[cur_node]).size(); ++i) { 
- 					int adj_node =  (g->adj[cur_node])[i].first; 
- 					if (visited[adj_node] == false) { 
- 						visited[adj_node] = true; 
- 						min_dist_from_source[adj_node] = min_dist_from_source[cur_node] + 1; 
- 						q.push(adj_node); 
- 					} 
- 				} 
- 				q.pop(); 
- 			} 
-   
- 			return; 
-     } 
-   
-     int min_dist_internal(int target){ 
-     	return min_dist_from_source[target]; 
-     } 
-   
-     bool is_visited_internal(int target){ 
-     	return visited[target]; 
-     } 
-   
- }; 
- //END COPYING HERE 
- //********************BLACKBOX END****************** 
-   
- int main() { 
-   int n,m; cin>>n>>m; 
-   
-   Graph g(n,false); 
-   
-   int x,y; 
-   for(int i=0;i<m;i++){ 
-     cin>>x>>y; 
-     g.add_edge(x,y); 
-   } 
-   
-   cin>>x>>y; 
-   
-   BFS bfs(&g); 
-   bfs.run(x); 
-   
-   if(bfs.is_visited(y)) 
-     cout<<bfs.min_dist(y)<<'\n'; 
-   else 
-     cout<<"0\n"; 
-   
-   
-   
-   return 0; 
- } 
-   
				I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKLy9DT1BZIFRIRSBCTEFDS0JPWCwgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgaW4gaXQuCi8vQ2hlY2sgdGhlIG1haW4gZnVuY3Rpb24gYXQgYm90dG9tIGZvciBVU0FHRQoKLy8qKioqKioqKioqKioqKioqQkxBQ0tCT1ggU1RBUlQqKioqKioqKioqKioqKioqKgovL1NUQVJUIENPUFlJTkcgRlJPTSBIRVJFCgp0eXBlZGVmIGludCBsbDsKCmNsYXNzIEhhc2ggewogIHB1YmxpYzoKICAJc3RhdGljIGludCBoYXNoKGludCB4KXsKICAJCXJldHVybiBoYXNoKHswLDAseH0pOwogIAl9CiAgCXN0YXRpYyBpbnQgaGFzaCh0dXBsZTxpbnQsaW50PngpewogIAkJcmV0dXJuIGhhc2goezAsZ2V0PDA+KHgpLGdldDwxPih4KX0pOwogIAl9CiAgCXN0YXRpYyBpbnQgaGFzaCh0dXBsZTxpbnQsaW50LGludD54KXsKICAJCWludCBrPWdldDwwPih4KSx1PWdldDwxPih4KSx2PWdldDwyPih4KTsKICAJCXJldHVybiBrKjE4NzMqMTg3MyArIHUqMTg3MyArIHY7CiAgCX0KfTsKCmNsYXNzIEdyYXBoIHsKCQoJYm9vbCBpc19kaXJlY3RlZDsKCQoJcHVibGljOgoJCXZlY3Rvcjx2ZWN0b3I8cGFpcjxpbnQsbGw+Pj5hZGo7CiAgICBpbnQgbixOPTIwMDAwMDA7CiAgICAKCQlHcmFwaChpbnQgbl8sIGJvb2wgaXNfZGlyZWN0ZWRfKXsKCQkJbj1uXzsgaXNfZGlyZWN0ZWQgPSBpc19kaXJlY3RlZF87CgkJCWFkai5yZXNpemUoTix2ZWN0b3I8cGFpcjxpbnQsbGw+PigpKTsKCQl9CgoJCWludCBoYXNoKGludCB1LCBpbnQgdil7CgkJCXJldHVybiBIYXNoOjpoYXNoKHt1LHZ9KTsKCQl9CgkJaW50IGhhc2goaW50IHUsIGludCB2LCBpbnQgayl7CgkJCXJldHVybiBIYXNoOjpoYXNoKHt1LHYsa30pOwoJCX0KCQkKCQl2b2lkIGFkZF9lZGdlKGludCB1UiwgaW50IHZSLCBsbCBjPTApewoJCSAgaW50IHU9SGFzaDo6aGFzaCh1UiksIHY9SGFzaDo6aGFzaCh2Uik7CgkJICBhZGRfZWRnZV9pbnRlcm5hbCh1LHYsYyk7CgkJfQoJCXZvaWQgYWRkX2VkZ2UodHVwbGU8aW50LGludD4gdVIsIHR1cGxlPGludCxpbnQ+IHZSLCBsbCBjPTApewoJCSAgaW50IHU9SGFzaDo6aGFzaCh1UiksIHY9SGFzaDo6aGFzaCh2Uik7CgkJICBhZGRfZWRnZV9pbnRlcm5hbCh1LHYsYyk7CgkJfQoJCQl2b2lkIGFkZF9lZGdlKHR1cGxlPGludCxpbnQsaW50PiB1UiwgdHVwbGU8aW50LGludCxpbnQ+IHZSLCBsbCBjPTApewoJCSAgaW50IHU9SGFzaDo6aGFzaCh1UiksIHY9SGFzaDo6aGFzaCh2Uik7CgkJICBhZGRfZWRnZV9pbnRlcm5hbCh1LHYsYyk7CgkJfQoJCQoKCXByaXZhdGUgOgoJCQoJICB2b2lkIGFkZF9lZGdlX2ludGVybmFsKGludCB1LCBpbnQgdiwgbGwgYz0wKXsKCQkJYWRkX2VkZ2Vfd2VpZ2h0ZWRfdW5kaXJlY3RlZCh1LHYsYyk7CgkJCWlmKCFpc19kaXJlY3RlZCkKCQkJCWFkZF9lZGdlX3dlaWdodGVkX3VuZGlyZWN0ZWQodix1LGMpOwoJCX0KCQl2b2lkIGFkZF9lZGdlX3dlaWdodGVkX3VuZGlyZWN0ZWQoaW50IHUsIGludCB2LCBsbCBjKSB7CgkJCXBhaXI8aW50LGxsPnAgPSBtYWtlX3BhaXIodixjKTsKCQkJYWRqW3VdLnB1c2hfYmFjayhwKTsKCQl9CgkKfTsKCmNsYXNzIEJGUyB7IAogICAgdmVjdG9yPGxsPm1pbl9kaXN0X2Zyb21fc291cmNlOwogICAgdmVjdG9yPGJvb2w+IHZpc2l0ZWQ7CiAgICBHcmFwaCAqZzsKCiAgICBwdWJsaWM6CiAgICAgIEJGUyhHcmFwaCAqZ18pIHsKICAgICAgICAgIGcgPSBnXzsKICAgICAgICAgIGNsZWFyKCk7CiAgICAgIH0KICAgICAgCgkgIAl2b2lkIGNsZWFyKCkgewogIAkJCW1pbl9kaXN0X2Zyb21fc291cmNlLmNsZWFyKCk7CiAgCQkJbWluX2Rpc3RfZnJvbV9zb3VyY2UucmVzaXplKGctPk4sLTEpOwogIAkJCXZpc2l0ZWQuY2xlYXIoKTsKICAJCQl2aXNpdGVkLnJlc2l6ZShnLT5OLCBmYWxzZSk7CiAgCQl9CgogICAgIAogICAgICB2b2lkIHJ1bihpbnQgc291cmNlUikgewogICAgICAgIGludCBzb3VyY2UgPSBIYXNoOjpoYXNoKHNvdXJjZVIpOwogICAgICAgIHJ1bl9pbnRlcm5hbChzb3VyY2UpOwogICAgICB9CiAgICAgIHZvaWQgcnVuKHR1cGxlPGludCxpbnQ+IHNvdXJjZVIpIHsKICAgICAgICBpbnQgc291cmNlID0gSGFzaDo6aGFzaChzb3VyY2VSKTsKICAgICAgICBydW5faW50ZXJuYWwoc291cmNlKTsKICAgICAgfQogICAgICB2b2lkIHJ1bih0dXBsZTxpbnQsaW50LGludD4gc291cmNlUikgewogICAgICAgIGludCBzb3VyY2UgPSBIYXNoOjpoYXNoKHNvdXJjZVIpOwogICAgICAgIHJ1bl9pbnRlcm5hbChzb3VyY2UpOwogICAgICB9CiAgICAgICAKICAgICAgCiAgICAgIGludCBtaW5fZGlzdChpbnQgdGFyZ2V0Uil7CiAgICAgIAlpbnQgdGFyZ2V0ID0gSGFzaDo6aGFzaCh0YXJnZXRSKTsKICAgICAgCXJldHVybiBtaW5fZGlzdF9pbnRlcm5hbCh0YXJnZXQpOwogICAgICB9CiAgICAgIGludCBtaW5fZGlzdCh0dXBsZTxpbnQsaW50PiB0YXJnZXRSKXsKICAgICAgCWludCB0YXJnZXQgPSBIYXNoOjpoYXNoKHRhcmdldFIpOwogICAgICAJcmV0dXJuIG1pbl9kaXN0X2ludGVybmFsKHRhcmdldCk7CiAgICAgIH0KICAgICAgaW50IG1pbl9kaXN0KHR1cGxlPGludCxpbnQsaW50PiB0YXJnZXRSKXsKICAgICAgCWludCB0YXJnZXQgPSBIYXNoOjpoYXNoKHRhcmdldFIpOwogICAgICAJcmV0dXJuIG1pbl9kaXN0X2ludGVybmFsKHRhcmdldCk7CiAgICAgIH0KCiAgICAgIGJvb2wgaXNfdmlzaXRlZChpbnQgdGFyZ2V0Uil7CiAgICAgIAlpbnQgdGFyZ2V0ID0gSGFzaDo6aGFzaCh0YXJnZXRSKTsKICAgICAgCXJldHVybiBpc192aXNpdGVkX2ludGVybmFsKHRhcmdldCk7CiAgICAgIH0KICAgICAgYm9vbCBpc192aXNpdGVkKHR1cGxlPGludCxpbnQ+IHRhcmdldFIpewogICAgICAJaW50IHRhcmdldCA9IEhhc2g6Omhhc2godGFyZ2V0Uik7CiAgICAgIAlyZXR1cm4gaXNfdmlzaXRlZF9pbnRlcm5hbCh0YXJnZXQpOwogICAgICB9CiAgICAgIGJvb2wgaXNfdmlzaXRlZCh0dXBsZTxpbnQsaW50LGludD4gdGFyZ2V0Uil7CiAgICAgIAlpbnQgdGFyZ2V0ID0gSGFzaDo6aGFzaCh0YXJnZXRSKTsKICAgICAgCXJldHVybiBpc192aXNpdGVkX2ludGVybmFsKHRhcmdldCk7CiAgICAgIH0KICAKICBwcml2YXRlOgogICAgdm9pZCBydW5faW50ZXJuYWwoaW50IHNvdXJjZSkgewoJCQlxdWV1ZTxpbnQ+IHE7CgkJCXEucHVzaChzb3VyY2UpOwoJCQkKCQkJdmlzaXRlZFtzb3VyY2VdID0gdHJ1ZTsKCQkJbWluX2Rpc3RfZnJvbV9zb3VyY2Vbc291cmNlXSA9IDA7CgkJCQoJCQl3aGlsZSghcS5lbXB0eSgpKSB7CgkJCQlpbnQgY3VyX25vZGUgPSBxLmZyb250KCk7CgkJCQlmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IChnLT5hZGpbY3VyX25vZGVdKS5zaXplKCk7ICsraSkgewoJCQkJCWludCBhZGpfbm9kZSA9ICAoZy0+YWRqW2N1cl9ub2RlXSlbaV0uZmlyc3Q7CgkJCQkJaWYgKHZpc2l0ZWRbYWRqX25vZGVdID09IGZhbHNlKSB7CgkJCQkJCXZpc2l0ZWRbYWRqX25vZGVdID0gdHJ1ZTsKCQkJCQkJbWluX2Rpc3RfZnJvbV9zb3VyY2VbYWRqX25vZGVdID0gbWluX2Rpc3RfZnJvbV9zb3VyY2VbY3VyX25vZGVdICsgMTsKCQkJCQkJcS5wdXNoKGFkal9ub2RlKTsKCQkJCQl9CgkJCQl9CgkJCQlxLnBvcCgpOwoJCQl9CgkJCQoJCQlyZXR1cm47CiAgICB9CiAgICAKICAgIGludCBtaW5fZGlzdF9pbnRlcm5hbChpbnQgdGFyZ2V0KXsKICAgIAlyZXR1cm4gbWluX2Rpc3RfZnJvbV9zb3VyY2VbdGFyZ2V0XTsKICAgIH0KICAgIAogICAgYm9vbCBpc192aXNpdGVkX2ludGVybmFsKGludCB0YXJnZXQpewogICAgCXJldHVybiB2aXNpdGVkW3RhcmdldF07CiAgICB9Cgp9OwovL0VORCBDT1BZSU5HIEhFUkUKLy8qKioqKioqKioqKioqKioqKioqKkJMQUNLQk9YIEVORCoqKioqKioqKioqKioqKioqKgoKaW50IG1haW4oKSB7CiAgaW50IG4sbTsgY2luPj5uPj5tOwogIAogIEdyYXBoIGcobixmYWxzZSk7CiAgCiAgaW50IHgseTsKICBmb3IoaW50IGk9MDtpPG07aSsrKXsKICAgIGNpbj4+eD4+eTsKICAgIGcuYWRkX2VkZ2UoeCx5KTsKICB9CiAgCiAgY2luPj54Pj55OwogIAogIEJGUyBiZnMoJmcpOwogIGJmcy5ydW4oeCk7CiAgCiAgaWYoYmZzLmlzX3Zpc2l0ZWQoeSkpCiAgICBjb3V0PDxiZnMubWluX2Rpc3QoeSk8PCdcbic7CiAgZWxzZQogICAgY291dDw8IjBcbiI7CgoJCgogIHJldHVybiAwOwp9Cg==