#include <bits/stdc++.h>
using namespace std;
int n, m, k, l[200010], r[200010], v[200010], ans[200010];
class graph {
 public:
  vector<int> G[200010];
  int deg[200010];
  void addedge(int s, int e) {
    G[s].push_back(e);
    deg[e]++;
  }
} G1, G2;
vector<int> P[200010];
priority_queue<pair<int, int> > Q;
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &v[i]);
    if (v[i])
      l[i] = r[i] = v[i];
    else
      l[i] = 1, r[i] = k;
  }
  for (int i = 1, ti, tj; i <= m; i++) {
    scanf("%d%d", &ti, &tj);
    G1.addedge(ti, tj);
    G2.addedge(tj, ti);
  }
  queue<int> q;
  for (int i = 1; i <= n; i++) {
    if (G1.deg[i] == 0) q.push(i);
  }
  while (!q.empty()) {
    int fr = q.front();
    q.pop();
    for (int x : G1.G[fr]) {
      r[x] = min(r[x], r[fr] - 1);
      G1.deg[x]--;
      if (!G1.deg[x]) q.push(x);
    }
  }
  for (int i = 1; i <= n; i++) {
    if (G1.deg[i]) {
      puts("-1");
      return 0;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (G2.deg[i] == 0) q.push(i);
  }
  while (!q.empty()) {
    int fr = q.front();
    q.pop();
    for (int x : G2.G[fr]) {
      l[x] = max(l[x], l[fr] + 1);
      G2.deg[x]--;
      if (!G2.deg[x]) q.push(x);
    }
  }
  for (int i = 1; i <= n; i++) {
    if (G2.deg[i] || l[i] > r[i]) {
      puts("-1");
      return 0;
    }
  }
  for (int i = 1; i <= n; i++) P[r[i]].push_back(i);
  for (int i = k; i >= 1; i--) {
    for (int j : P[i]) Q.push(make_pair(l[j], j));
    if (Q.empty()) {
      puts("-1");
      return 0;
    }
    int tp = Q.top().second;
    ans[tp] = i;
    Q.pop();
    while (!Q.empty()) {
      tp = Q.top().second;
      if (l[tp] < i) break;
      Q.pop();
      ans[tp] = i;
    }
  }
  for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
  return 0;
}
