#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
int n, m, K, lab[maxn], deg[maxn], Deg[maxn], r[maxn], L[maxn], R[maxn];
vector<int> rG[maxn], G[maxn], cand[maxn];
queue<int> q;
priority_queue<pair<int, int> > Q;
int main() {
  scanf("%d%d%d", &n, &m, &K);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &r[i]);
    L[i] = (r[i] == 0) ? 1 : r[i];
    R[i] = (r[i] == 0) ? K : r[i];
  }
  for (int i = 0; i < m; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    G[u].push_back(v);
    rG[v].push_back(u);
    ++deg[v];
    ++Deg[u];
  }
  for (int i = 1; i <= n; ++i)
    if (!deg[i]) q.push(i);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (auto v : G[u]) {
      R[v] = min(R[v], R[u] - 1);
      --deg[v];
      if (deg[v] == 0) q.push(v);
    }
  }
  for (int i = 1; i <= n; ++i)
    if (!Deg[i]) q.push(i);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (auto v : rG[u]) {
      L[v] = max(L[v], L[u] + 1);
      --Deg[v];
      if (Deg[v] == 0) q.push(v);
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (L[i] > R[i] || deg[i] > 0 || Deg[i] > 0) return 0 * puts("-1");
    deg[i] = rG[i].size();
    if (deg[i] == 0) cand[R[i]].push_back(i);
  }
  for (auto v : cand[K]) Q.push(pair<int, int>(L[v], v));
  int i = K;
  while (!Q.empty()) {
    bool ok = false;
    while (!Q.empty() && Q.top().first == i) {
      ok = true;
      int u = Q.top().second;
      Q.pop();
      lab[u] = i;
      for (auto v : G[u]) {
        --deg[v];
        if (deg[v] == 0) cand[min(R[v], i - 1)].push_back(v);
      }
    }
    if (!ok) {
      int u = Q.top().second;
      Q.pop();
      lab[u] = i;
      for (auto v : G[u]) {
        --deg[v];
        if (deg[v] == 0) cand[min(R[v], i - 1)].push_back(v);
      }
    }
    --i;
    for (auto v : cand[i]) Q.push(pair<int, int>(L[v], v));
  }
  if (i != 0) return 0 * puts("-1");
  for (int i = 1; i <= n; ++i) printf("%d%c", lab[i], i == n ? '\n' : ' ');
  return 0;
}
