#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10, mod = 1e9 + 7, inf = 1e12;
inline int read()
{
char ch = getchar();
int s = 0, w = 1;
while(ch < '0' || '9' < ch){ if(ch == '-'){w = -1;} ch = getchar();}
while('0' <= ch && ch <= '9'){s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();}
return s * w;
}
int m, n;
int head[N], ne[N], to[N], id = 1, w[N];
void add(int x, int y, int z)
{
to[++id] = y, ne[id] = head[x], head[x] = id, w[id] = z;
}
int S, T;
int now[N], dis[N];
int q[N], ql, qr;
void bfs(int s)
{
for(int i = 1; i <= n + n; i++) dis[i] = 1e18;
dis[q[ql = qr = 1] = s] = 0;
while(ql <= qr)
{
int u = q[ql++];
for(int i = head[u]; i; i = ne[i])
{
int v = to[i];
if(w[i] && dis[v] == 1e18)
{
dis[v] = dis[u] + 1;
q[++qr] = v;
}
}
}
}
int dfs(int u, int f)
{
if(u == T) return f;
int res = f;
for(int &i = now[u]; i; i = ne[i])
{
int v = to[i];
if(w[i] && dis[v] == dis[u] + 1)
{
int t = dfs(v, min(res, w[i]));
if(t)
{
w[i] -= t, w[i ^ 1] += t;
res -= t;
if(!res) break;
}
}
}
return f - res;
}
int dinic()
{
int ans = 0;
while(1)
{
for(int i = 1; i <= n + n; i++) now[i] = head[i];
bfs(S + n);
int f = dfs(S + n, 1e18);
if(!f) return ans;
ans += f;
}
return -1;
}
void solve()
{
n = read(), m = read(), S = read(), T = read();
for(int i = 1; i <= m; i++)
{
int x = read(), y = read();
add(x + n, y, 1e18);
add(y + n, x, 1e18);
}
for(int i = 1; i <= n; i++) add(i, i + n, 1);
printf("%lld\n", dinic());
}
signed main()
{
// freopen("graph.in", "r", stdin);
// freopen("graph.out", "w", stdout);
int T = 1;
while(T--) solve();
return 0;
}
求大佬调一调