#include using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif struct dsu { vector ps; // parent or size dsu(int n) : ps(n, -1) {} int leader(int x) { return ps[x] < 0 ? x : ps[x] = leader(ps[x]); } int merge(int x, int y) { x = leader(x); y = leader(y); if (x == y) return x; if (ps[x] < ps[y]) swap(x, y); ps[y] += ps[x]; ps[x] = y; return y; } bool same(int x, int y) { return leader(x) == leader(y); } int size(int x) { return -ps[leader(x)]; } }; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m, s, t; cin >> n >> m >> s >> t; --s; --t; vector p(n); for (int i = 0; i < n; i++) cin >> p[i]; dsu g(n); vector> adj(n); for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; a--; b--; if (p[a] == p[b]) g.merge(a, b); else if (p[a] < p[b]) adj[a].push_back(b); else adj[b].push_back(a); } vector l(n); iota(l.begin(), l.end(), 0); sort(l.begin(), l.end(), [&](int i, int j){return p[i] > p[j];}); int ans = 0; for (int u : l) { for (int v : adj[u]) { if (!g.same(u, v)) { if (g.same(s, v)) ans++; g.merge(u, v); } } } cout << ans << '\n'; }