#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==