#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 300005
#define ll long long
using namespace std;
int n,m,t,x,y,l,r,ans[N];
ll s,a[N];
bool vis[N];
struct edge
{
    int nxt,v;
    edge () {}
    edge (int A,int B):nxt(A),v(B) {}
}e[N << 1];
int tot=1,fr[N];
void add(int x,int y)
{
    ++tot;
    e[tot]=edge(fr[x],y),fr[x]=tot;
}
void dfs(int u)
{
    vis[u]=true;
    for (int i=fr[u];i;i=e[i].nxt)
    {
        int v(e[i].v);
        if (vis[v])
            continue;
        dfs(v);
        if (a[u]+a[v]>=t)
        {
            a[u]=a[u]+a[v]-t;
            ans[l++]=i >> 1;
        } else
            ans[r--]=i >> 1;
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&t);
    for (int i=1;i<=n;++i)
        scanf("%lld",&a[i]),s+=a[i];
    if (s<(ll)(n-1)*t)
    {
        puts("NO");
        return 0;
    }
    for (int i=1;i<=m;++i)
    {
        scanf("%d%d",&x,&y);
        add(x,y),add(y,x);
    }
    l=1,r=n-1,dfs(1);
    puts("YES");
    for (int i=1;i<n;++i)
        printf("%d\n",ans[i]);
    return 0;
}