#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <cstring>
#include <string>
#include <cmath>
#include <cassert>
#include <ctime>
#include <algorithm>
#include <sstream>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <cstdlib>
#include <cstdio>
#include <iterator>
#include <functional>
#include <bitset>
#include <iomanip>
#include <float.h>
#include <numeric>
#define _USE_MATH_DEFINES
#include <math.h>

#define ll long long

#define FOR(i,a,b)        for(ll i=(a);i<(b);i++)
#define REP(i,n)        FOR(i,0,n)
#define SORT(v)            sort((v).begin(),(v).end())
#define UN(v)            SORT(v),(v).erase(unique((v).begin(),(v).end()),(v).end())
#define CL(a,b)            memset(a,b,sizeof a)
#define pb                push_back


#ifndef M_PI
    #define M_PI 3.14159265358979323846
#endif

using namespace std;

ll denom = 998244353;
ll powmod(ll a,ll b) {ll res=1;a%=denom; for(;b;b>>=1){if(b&1)res=res*a%denom;a=a*a%denom;}return res;}

int main(int argc, const char * argv[])
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    ll t = 1;
    while (t-- > 0) {
        ll n,m,x; cin >> n >> m >> x;
        vector<ll> a(n); REP(i, n) cin >> a[i]; // city amount
        vector<vector<pair<ll, ll>>> v(n); // to city, road index
        vector<pair<ll, ll>> road(m); REP(i, m) {cin >> road[i].first >> road[i].second; road[i].first--; road[i].second--; v[road[i].first].push_back({road[i].second, i}); v[road[i].second].push_back({road[i].first, i}); }
        ll sum = 0; REP(i, n) sum += a[i];
        if (sum < x*(n-1)) { cout << "NO" << endl; continue; }
        
        vector<bool> visited(n, false);
        queue<ll> q; q.push(0); visited[0] = true;
        vector<ll> pickedRoads;
        vector<set<pair<ll, ll>>> updated_v(n);
        while (q.size() > 0) {
            auto p = q.front(); q.pop();
            for (auto y : v[p]) {
                if (visited[y.first]) continue;
                visited[y.first] = true;
                pickedRoads.push_back(y.second);
                updated_v[p].insert(y);
                updated_v[y.first].insert({p, y.second});
                q.push(y.first);
            }
        }
        
        cout << "YES" << endl;
        queue<ll> leafes; REP(i, n) if (updated_v[i].size() == 1) { leafes.push(i); }
        
        stack<ll> lastRoads;
        while (leafes.size() > 0) {
            auto p = leafes.front(); leafes.pop();
            for (auto to : updated_v[p]) {
                if (a[to.first] + a[p] < x) { lastRoads.push(to.second); }
                else { cout << to.second + 1 << endl; a[to.first] += a[p] - x; }
                updated_v[to.first].erase({p, to.second});
                if (updated_v[to.first].size() == 1) leafes.push(to.first);
            }
        }
        while (lastRoads.size() > 0) {
            auto p = lastRoads.top(); lastRoads.pop();
            cout << p+1 << endl;
        }
    }
    return 0;
}


