#include #include #include #include #include #include using namespace std; #define rep(i, n) for (int i = 0; i < (n); i++) int main() { int N, M, S, T; cin >> N >> M >> S >> T; vector P(N); rep(i, N) cin >> P[i]; { auto Q = P; sort(Q.begin(),Q.end()); Q.erase(unique(Q.begin(),Q.end()), Q.end()); rep(i, N) P[i] = lower_bound(Q.begin(), Q.end(), P[i]) - Q.begin(); } vector> G(N); rep(i, M) { int a, b; cin >> a >> b; a--, b--; G[a].push_back(b); G[b].push_back(a); } S--, T--; atcoder::dsu uf(N); vector dp(N, -1); dp[S] = 0; rep(i, N) for(int j: G[i]) if(P[i] >= P[S] && P[j] >= P[S]) { uf.merge(i, j); int k = uf.leader(i); dp[k] = max(dp[k], max(dp[i], dp[j])); } vector> A(N); rep(i, N) A[P[i]].push_back(i); for(int i = P[S] - 1; i >= 0; i--) { for(int id: A[i]) { for(int j: G[id]) if(P[j] > i) { int k = uf.leader(j); if (dp[k] != -1) dp[j] = max(dp[j], dp[k] + 1); } } for(int id: A[i]) { for(int j: G[id]) if(P[j] >= i) { uf.merge(id, j); int k = uf.leader(j); dp[k] = max(dp[k], max(dp[id], dp[j])); } } } int ans = 0; rep(i, N) ans = max(ans, dp[i]); cout << ans << endl; }