#include <iostream>
#include <vector>
#include <queue>
#include <set>
#include <algorithm>

using namespace std;

const long long INF = 1e18;

int main() {
    int N, M;
    long long X, Y;
    cin >> N >> M >> X >> Y;

    vector<long long> H(N + 1);
    for (int i = 1; i <= N; ++i) {
        cin >> H[i];
    }

    vector<vector<pair<int, long long>>> adj(N + 1);
    for (int i = 0; i < M; ++i) {
        int u, v;
        cin >> u >> v;
        long long w_uv = max(0LL, H[v] - H[u]);
        long long w_vu = max(0LL, H[u] - H[v]);
        adj[u].push_back({v, w_uv});
        adj[v].push_back({u, w_vu});
    }

    vector<long long> dist(N + 1, INF);
    set<pair<long long, int>> st;
    dist[1] = 0;
    st.insert({0, 1});

    while (!st.empty()) {
        auto it = st.begin();
        long long d = it->first;
        int u = it->second;
        st.erase(it);

        if (d > dist[u]) continue;

        for (auto& edge : adj[u]) {
            int v = edge.first;
            long long w = edge.second;
            if (dist[u] + w < dist[v]) {
                st.erase({dist[v], v});
                dist[v] = dist[u] + w;
                st.insert({dist[v], v});
            }
        }
    }

    if (dist[N] == INF) {
        cout << "N" << endl;
    } else {
        long long min_asc = dist[N];
        long long min_desc = min_asc - (H[N] - H[1]);
        if (min_asc <= X && min_desc <= Y) {
            cout << "S" << endl;
        } else {
            cout << "N" << endl;
        }
    }

    return 0;
}
