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

#define INF 1234567890
#define ll long long

int N, M, X;
ll A[300301], ADD[300301];
pair<int, int> e[300301];
queue<pair<ll, int> > q; // 포화 간선들 저장

set<pair<ll, int> > g[300301]; // 이거 크기로 small to large 할거임

int p[300301]; // g[Find(i)]

int Find(int n)
{
	if (n == p[n]) return n;
	return p[n] = Find(p[n]);
}

void Union(int a, int b)
{
	a = Find(a); b = Find(b);
	if (a == b) assert(0);

	if (g[a].size() < g[b].size()) swap(a, b);
	// b에서 a로 하나씩 이동시키자. small to large
	ADD[a] += A[b] - X;

	for(auto &[val,idx] : g[b])
		g[a].insert({val+ADD[b]-ADD[a],idx});
	g[b].clear();

	A[a] = A[a] + A[b] - X;

	p[b] = a;
}

int main()
{
	scanf("%d %d %d", &N, &M, &X);
	for(int i=1; i<=N; i++)
		p[i] = i;

	ll total_sum = 0;
	for(int i=1; i<=N; i++)
	{
		scanf("%lld", &A[i]);
		total_sum += A[i];
	}

	for(int i=1; i<=M; i++)
	{
		int a, b;
		scanf("%d %d", &a, &b);
		e[i] = {a, b};

		if (A[a] + A[b] >= X)
			q.push({A[a]+A[b], i});
		else
		{
			g[a].insert({A[a]+A[b], i});
			g[b].insert({A[a]+A[b], i});
		}
	}

	vector<int> res;

	int merge_cnt = 0;
	while(!q.empty())
	{
		auto [val,i] = q.front(); q.pop();
		auto [a,b] = e[i];
		a = Find(a); b = Find(b); //
		if (a == b) continue;

		if (A[a] + A[b] < X) //
		{
			// 다시 넣어줘야 한다...
			g[a].insert({A[a]+A[b]-ADD[a], i});
			g[b].insert({A[a]+A[b]-ADD[b], i});
			continue;
		}

		Union(a, b);
		a = Find(a);

		res.push_back(i);
		merge_cnt++;
		
		int cnt = 0;
		while (!g[a].empty())
		{
			auto it = g[a].rbegin();
			if (it->first+ADD[a] < X) break;
			q.push({it->first+ADD[a],it->second});
			int oa = a;

			ll val = it->first;
			int i = it->second;
			auto [a,b] = e[i];
			a = Find(a); b = Find(b);
			if (a != oa) swap(a, b); //

			g[a].erase({val, i});
			g[b].erase({val+ADD[a]-ADD[b], i});
		}
	}

	if (merge_cnt < N-1) return !printf("NO\n");
	printf("YES\n");
	// 출력 까먹지 말자
	// 출력 까먹지 말자
	// 출력 까먹지 말자
	// 출력 까먹지 말자
	// 출력 까먹지 말자
	// 출력 까먹지 말자
	// 출력 까먹지 말자
	// 출력 까먹지 말자
	// 출력 까먹지 말자
	// 출력 까먹지 말자
	for(int x : res)
		printf("%d\n", x);
	return 0;
}