#include <bits/stdc++.h>
using namespace std;

#define Gene template< class
#define Rics printer& operator,
Gene c> struct rge{c b, e;};
Gene c> rge<c> range(c i, c j){ return {i, j};}
struct printer{
    ~printer(){cerr<<endl;}
    Gene c >Rics(c x){ cerr<<boolalpha<<x; return *this;}
    Rics(string x){cerr<<x;return *this;}
    Gene c, class d >Rics(pair<c, d> x){ return *this,"(",x.first,", ",x.second,")";}
    Gene ... d, Gene ...> class c >Rics(c<d...> x){ return *this, range(begin(x), end(x));}
    Gene c >Rics(rge<c> x){
        *this,"["; for(auto it = x.b; it != x.e; ++it)
            *this,(it==x.b?"":", "),*it; return *this,"]";}
};
#define debug() cerr<<"LINE "<<__LINE__<<" >> ", printer()
#define dbg(x) "[",#x,": ",(x),"] "
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int my_rand(int l, int r) {
    return uniform_int_distribution<int>(l, r) (rng);
}

int P(int u, vector<int> &par) {
    if(u == par[u]) return u;
    return par[u] = P(par[u], par);
}

int main() {

    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, m, X;
    cin >> n >> m >> X;
    vector<vector<pair<int,int>>> adj(n);
    vector<pair<int,int>> edges(m);
    vector<int> par(n);
    for(int i = 0; i < n; i++) par[i] = i;
    vector<int> treeEdges;
    vector<long long> a(n);
    long long sum = 0;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
        sum += a[i];
    }
    if(sum < 1ll*(n-1)*X) {
        cout << "NO" << endl;
        return 0;
    }
    for(int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        u--, v--;
        edges[i] = make_pair(u, v);

        u = P(u, par), v = P(v, par);
        if(u != v) {
            par[u] = v;
            treeEdges.push_back(i);
        }
    }
    vector<int> deg(n);
    for(int i = 0; i < treeEdges.size(); i++) {
        int u = edges[treeEdges[i]].first, v = edges[treeEdges[i]].second;
        deg[u]++;
        deg[v]++;
        adj[u].push_back({v, treeEdges[i]});
        adj[v].push_back({u, treeEdges[i]});
    }
    vector<int> done(n);
    vector<int> leaves;
    for(int i = 0; i < n; i++) {
        if(deg[i] == 1) leaves.push_back(i);
    }
    vector<int> res(n-1);
    int L = 0, R = n-2;


    for(int itr = 0; itr < n-1; itr++) {
        int u = leaves.back();
        leaves.pop_back();
        int p = -1, eid = -1;
        for(auto t : adj[u]) {
            int v = t.first;
            if(done[v]) continue;
            p = v;
            eid = t.second;
            deg[v]--;
            if(deg[v] == 1) {
                leaves.push_back(v);
            }
        }
        assert(p != -1);
        if(a[u] >= X or itr == n-2) {
            res[L++] = eid;
            a[p] += a[u]-X;
        }
        else {
            res[R--] = eid;
        }
        done[u] = 1;
    }
    cout << "YES" << endl;
    for(int i = 0; i < n-1; i++) cout << res[i]+1 << " ";
}


