#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 255;
int n, m, s, t;
vector<int> adj[N];
// Nếu lưu đỉnh ở dạng (u, v) thì chi phí duyệt cạnh để chuyển sang (nxt_u, nxt_v) khá lớn. ~ O(n^4)
// Nên ta sẽ thêm chiều turn, (u, v, turn): sếp 1 đang ở đỉnh u, sếp 2 đang ở đỉnh v, và ở lượt này sếp 1 hay sếp 2 sẽ đi (turn = 0/1)
// Số đỉnh tăng lên nhưng đổi lại thì chi phí duyệt cạnh (hay số cạnh) sẽ ít hơn. ~ O(n^3)
struct Node {
int u, v;
bool turn;
};
bool vis[N][N][2];
int dist[N][N][2];
int bfs(int s, int t) {
memset(vis, 0, sizeof vis);
memset(dist, -1, sizeof dist);
queue<Node> q;
vis[s][t][0] = true;
dist[s][t][0] = 0;
q.push({s, t, 0});
while (!q.empty()) {
Node front = q.front(); q.pop();
int u = front.u, v = front.v; bool turn = front.turn;
int d = dist[u][v][turn];
if (u == v && turn == 0) {
return d / 2;
}
if (turn == 0) {
for (int nxt_u : adj[u]) {
if (!vis[nxt_u][v][1]) {
vis[nxt_u][v][1] = true;
dist[nxt_u][v][1] = d + 1;
q.push({nxt_u, v, 1});
}
}
}
else {
for (int nxt_v : adj[v]) {
if (!vis[u][nxt_v][0]) {
vis[u][nxt_v][0] = true;
dist[u][nxt_v][0] = d + 1;
q.push({u, nxt_v, 0});
}
}
}
}
return -1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
cin >> s >> t;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
}
int ans = bfs(s, t);
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAyNTU7ICAgCgppbnQgbiwgbSwgcywgdDsgICAKdmVjdG9yPGludD4gYWRqW05dOyAKCi8vIE7hur91IGzGsHUgxJHhu4luaCDhu58gZOG6oW5nICh1LCB2KSB0aMOsIGNoaSBwaMOtIGR1eeG7h3QgY+G6oW5oIMSR4buDIGNodXnhu4NuIHNhbmcgKG54dF91LCBueHRfdikga2jDoSBs4bubbi4gfiBPKG5eNCkKLy8gTsOqbiB0YSBz4bq9IHRow6ptIGNoaeG7gXUgdHVybiwgKHUsIHYsIHR1cm4pOiBz4bq/cCAxIMSRYW5nIOG7nyDEkeG7iW5oIHUsIHPhur9wIDIgxJFhbmcg4bufIMSR4buJbmggdiwgdsOgIOG7nyBsxrDhu6N0IG7DoHkgc+G6v3AgMSBoYXkgc+G6v3AgMiBz4bq9IMSRaSAodHVybiA9IDAvMSkKLy8gU+G7kSDEkeG7iW5oIHTEg25nIGzDqm4gbmjGsG5nIMSR4buVaSBs4bqhaSB0aMOsIGNoaSBwaMOtIGR1eeG7h3QgY+G6oW5oIChoYXkgc+G7kSBj4bqhbmgpIHPhur0gw610IGjGoW4uIH4gTyhuXjMpCgpzdHJ1Y3QgTm9kZSB7CglpbnQgdSwgdjsgCglib29sIHR1cm47IAp9OwogCmJvb2wgdmlzW05dW05dWzJdOyAKaW50IGRpc3RbTl1bTl1bMl07CgppbnQgYmZzKGludCBzLCBpbnQgdCkgewoJbWVtc2V0KHZpcywgMCwgc2l6ZW9mIHZpcyk7ICAKCW1lbXNldChkaXN0LCAtMSwgc2l6ZW9mIGRpc3QpOyAKCglxdWV1ZTxOb2RlPiBxOyAKCXZpc1tzXVt0XVswXSA9IHRydWU7ICAKCWRpc3Rbc11bdF1bMF0gPSAwOyAKCXEucHVzaCh7cywgdCwgMH0pOyAgIAoKCXdoaWxlICghcS5lbXB0eSgpKSB7CgkJTm9kZSBmcm9udCA9IHEuZnJvbnQoKTsgcS5wb3AoKTsgIAoJCWludCB1ID0gZnJvbnQudSwgdiA9IGZyb250LnY7IGJvb2wgdHVybiA9IGZyb250LnR1cm47ICAKCQlpbnQgZCA9IGRpc3RbdV1bdl1bdHVybl07ICAgCgoJCWlmICh1ID09IHYgJiYgdHVybiA9PSAwKSB7CgkJCXJldHVybiBkIC8gMjsKCQl9CgoJCWlmICh0dXJuID09IDApIHsKCQkJZm9yIChpbnQgbnh0X3UgOiBhZGpbdV0pIHsKCQkJCWlmICghdmlzW254dF91XVt2XVsxXSkgewoJCQkJCXZpc1tueHRfdV1bdl1bMV0gPSB0cnVlOyAKCQkJCQlkaXN0W254dF91XVt2XVsxXSA9IGQgKyAxOyAgCgkJCQkJcS5wdXNoKHtueHRfdSwgdiwgMX0pOyAKCQkJCX0KCQkJfQoJCX0KCQllbHNlIHsKCQkJZm9yIChpbnQgbnh0X3YgOiBhZGpbdl0pIHsKCQkJCWlmICghdmlzW3VdW254dF92XVswXSkgewoJCQkJCXZpc1t1XVtueHRfdl1bMF0gPSB0cnVlOyAgCgkJCQkJZGlzdFt1XVtueHRfdl1bMF0gPSBkICsgMTsgIAoJCQkJCXEucHVzaCh7dSwgbnh0X3YsIDB9KTsgCgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIC0xOyAKfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG4gPj4gbTsgCgljaW4gPj4gcyA+PiB0OyAKCglmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewoJCWludCB1LCB2OyAKCQljaW4gPj4gdSA+PiB2OyAKCQlhZGpbdV0ucHVzaF9iYWNrKHYpOyAKCX0KCglpbnQgYW5zID0gYmZzKHMsIHQpOyAKCgljb3V0IDw8IGFucyA8PCAnXG4nOyAKfQ==