func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 2e+5 + 10;   const int INF = 0x7fffffff;   struct edge {     int v, n;   } e[maxn * 2];   struct node {     int mx, mi, i, c;     bool operator<(const node &sec) const { return mx > sec.mx; }   } a[maxn];   int n, m, k;   int head[maxn], rd[maxn];   void read() {     int i, u, v;     scanf( %d%d%d , &n, &m, &k);     for (i = 1; i <= n; i++) {       scanf( %d , &a[i].c);       a[i].i = i;       if (a[i].c)         a[i].mx = a[i].mi = a[i].c;       else         a[i].mx = k, a[i].mi = 1;     }     memset(head, -1, sizeof(head));     for (i = 0; i < m; i++) {       scanf( %d%d , &u, &v);       e[i << 1].v = v;       e[i << 1].n = head[u];       head[u] = i << 1;       e[i << 1 | 1].v = u;       e[i << 1 | 1].n = head[v];       head[v] = i << 1 | 1;     }   }   void tuopu(int d) {     int i, u, v;     queue<int> q;     memset(rd, 0, sizeof(rd));     for (i = 0; i < m; i++) rd[e[i << 1 | d].v]++;     for (i = 1; i <= n; i++)       if (!rd[i]) q.push(i);     while (!q.empty()) {       u = q.front();       q.pop();       for (i = head[u]; i != -1; i = e[i].n)         if ((i & 1) == d) {           v = e[i].v;           rd[v]--;           if (!rd[v]) q.push(v);           if (d)             a[v].mi = max(a[v].mi, a[u].mi + 1);           else             a[v].mx = min(a[v].mx, a[u].mx - 1);         }     }     for (i = 1; i <= n; i++)       if (rd[i]) {         printf( -1 n );         exit(0);       }   }   bool cmpa(node aa, node bb) { return aa.mi < bb.mi; }   bool cmpi(node aa, node bb) { return aa.i < bb.i; }   void check() {     for (int i = 1; i <= n; i++)       if (a[i].mx < a[i].mi) {         printf( -1 n );         exit(0);       }   }   void solve() {     int i, j = 1;     priority_queue<node> q;     bool del;     for (i = 1; i <= k; i++) {       del = false;       for (; j <= n && a[j].mi == i; j++) {         node tmp = a[j];         tmp.i = j;         q.push(tmp);       }       while (!q.empty() && q.top().mx == i) {         node tmp = q.top();         q.pop();         a[tmp.i].c = i;         del = true;       }       if (!del) {         if (q.empty()) {           printf( -1 n );           exit(0);         }         node tmp = q.top();         q.pop();         a[tmp.i].c = i;       }     }   }   void print() {     for (int i = 1; i <= n; i++) printf( %d  , a[i].c);   }   int main() {     read();     tuopu(0);     tuopu(1);     sort(a + 1, a + n + 1, cmpa);     check();     solve();     sort(a + 1, a + n + 1, cmpi);     print();     return 0;   }   