#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--; adj[a].push_back(b); 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 minv = p[s]; int ans = 0; for (int u : l) { if (p[u] < minv) { for (int v : adj[u]) { if (g.same(s, v)) { ans++; minv = p[u]; break; } } } for (int v : adj[u]) if (p[v] >= p[u]) g.merge(u, v); } cout << ans << '\n'; }