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

#define int long long
#define fl(i,n) for(int i=0;i<n;i++) 
#define v(i) vector<int>
#define um unordered_map<int,int> 
#define pb push_back
#define pr pair<int,int>
#define NO cout<<"NO";
#define all(a) a.begin(),a.end()
#define YES cout<<"YES"; 
#define sortn(a) sort(a.begin(),a.end())
#define sortc(a,cp) sort(a.begin(),a.end(),cp)
#define pq priority_queue<int> 
#define vvi vector<v(i)>
#define reverse(a) reverse(a.begin(),a.end()) 

/* lcm(a,b) , _gcd(a,b) , swap(a,b) , sort(a.begin(),a.end()) , *max_element(a.begin(),a.end()) , *min_element(a.begin(),a.end()) */
/* _builtin_popcount(x): This function is used to count the number of one’s */
/*__builtin_clz(x): This function is used to count the leading zeros of the integer. */
/* string s.find("ks")==string::npos if not found */
/*__builtin_ctz(x): This function is used to count the trailing zeros of the given integer */
/* cout<<fixed<<setprecision(8)   ,  round(1.589) -> 2 , trunc(1.590) -> 1 , ceil(x) , floor(x) */

void SieveOfEratosthenes(int n) 
{ 
    
    bool prime[n+1]; 
    memset(prime, true, sizeof(prime)); 
  
    for (int p=2; p*p<=n; p++) 
    { 
      
        if (prime[p] == true) 
        { 
            for (int i=p*p; i<=n; i += p) 
                prime[i] = false; 
        } 
    } 

} 
int power(int x, int y, int m) 
{ 
    if (y == 0) 
        return 1; 
    int p = power(x, y / 2, m) % m; 
    p = (p * p) % m; 
  
    return (y % 2 == 0) ? p : (x * p) % m; 
}   

/* inverse of y is power(y,p-2,p) */



void print(v(i) a){
fl(i,a.size())
cout<<a[i]<<" ";
cout<<"\n";
}
int gcd( int a, int b)
{
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
 

int lcm(int a, int b)
{
    return (a / gcd(a, b)) * b;
}

bool cmp(int a,int b){ return a>b;}
class unn{
    public:
    v(i) par,sz;
    unn(int n){
        fl(i,n+1){
            par.pb(i);

        }
    }
    int getp(int x){
        if(par[x]==x) return x;
        par[x]=getp(par[x]);
        return par[x];
    }
    void add(int x,int y){
        int p1=getp(x),p2=getp(y);
        if(p1==p2) return;
       
        par[p2]=p1;
    }
};
bool cm(pair<pr,pr> a,pair<pr,pr> b){
    return a.first.first>b.first.first;
}
int32_t main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n,m,x;
    cin>>n>>m>>x;
    vector<pr> a(n+1);
    v(i) asp(n+1,INT32_MAX);
    int s=0;
    fl(i,n){
        int y; cin>>y;
        a[i]={y,i+1}; s+=a[i].first;
        asp[i+1]=y;
    }
    if(s<(n-1)*x){
        NO
        return 0;
    }
    vector<pr> edg;
    vector<vector<pr>> adj(n+1);
    fl(i,m){
        int g,y; cin>>g>>y;
        adj[g].pb({y,i});
        adj[y].pb({g,i});
  
    }
    
   // sortc(edg,cm);
    v(i) ans;
    sortn(a);
    reverse(a);
    int c=0;
    int i=0;
    unn ds(n);
    v(i) ans2;
    set<pr> p;
    fl(i,n){
        p.insert({a[i].first,a[i].second});
    }
    
    while(c<n-1){
      auto it=p.rbegin();
      auto it1=p.end();
      it1--;
      
      int g=(*it).second,tot=(*it).first;
    //  cout<<tot<<" "<<g<<" ";
      p.erase(it1);
      int prt=ds.getp(g);
       while(adj[g].size() && ds.getp(adj[g].back().first)==prt){
           adj[g].pop_back();  
       }
       if(adj[g].empty()) continue;
        pr k=adj[g].back();
           int y=k.first,id=k.second;
           adj[g].pop_back();
           int h=ds.getp(y);
           asp[g]=asp[g]+asp[h]-x;
           
           p.erase({h,asp[h]});
           ans.pb(id+1);
           
           ds.add(g,h);
           if(adj[h].size()>adj[g].size()){
               swap(adj[g],adj[h]);
           }
           for(auto l:adj[h]){
               adj[g].pb(l);
           }
           adj[h].clear();
           c++;
        
       p.insert({asp[g],g});
    
    }
     YES
        cout<<"\n";
    for(auto k:ans){
       
        cout<<k<<'\n';
    }
}
