#include <bits/stdc++.h>
const int N = 2e3 + 10;
inline int read() {
  int x = 0, f = 0;
  char ch = getchar();
  while (!isdigit(ch)) f |= ch == '-', ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return f ? -x : x;
}
int tot = 1, fir[N], nex[N], got[N], col[N];
inline void AddEdge(int u, int v, int c) {
  nex[++tot] = fir[u], fir[u] = tot, got[tot] = v, col[tot] = c;
  nex[++tot] = fir[v], fir[v] = tot, got[tot] = u, col[tot] = c;
}
int u[N], v[N], d[N], cur[N], id[N], use[N];
inline void dfs(int fa, int u, int fc, int c) {
  for (int i = fir[u]; i; i = nex[i])
    if (col[i] == fc && got[i] != fa) {
      col[i] = col[i ^ 1] = c;
      dfs(u, got[i], c, fc);
      break;
    }
}
int main() {
  int n = read(), m = read(), k = read();
  for (int i = 1, x; i <= n; ++i) x = read();
  for (int i = 1; i <= m; ++i) u[i] = read(), v[i] = read() + n;
  for (int i = 1; i <= m; ++i) ++d[u[i]], ++d[v[i]];
  n <<= 1, id[0] = 1;
  for (int i = 1; i <= n; ++i) d[i] = (d[i] + k - 1) / k;
  for (int i = 1; i <= n; ++i) id[i] = id[i - 1] + d[i - 1];
  for (int i = 1; i <= n; ++i) d[i] = 0;
  for (int i = 1; i <= m; ++i) {
    int u = ::u[i], v = ::v[i];
    ::u[i] = id[u], ++cur[u];
    if (cur[u] == k) cur[u] = 0, ++id[u];
    ::v[i] = id[v], ++cur[v];
    if (cur[v] == k) cur[v] = 0, ++id[v];
  }
  for (int i = 1; i <= m; ++i) {
    int u = ::u[i], v = ::v[i], c1 = 0, c2 = 0;
    for (int i = 1; i <= k; ++i) use[i] = 0;
    for (int i = fir[u]; i; i = nex[i]) use[col[i]] = 1;
    for (int i = 1; i <= k; ++i)
      if (!use[i]) {
        c1 = i;
        break;
      }
    for (int i = 1; i <= k; ++i) use[i] = 0;
    for (int i = fir[v]; i; i = nex[i]) use[col[i]] = 1;
    for (int i = 1; i <= k; ++i)
      if (!use[i]) {
        c2 = i;
        break;
      }
    AddEdge(u, v, c1), dfs(u, v, c1, c2);
  }
  for (int i = 2; i <= tot; i += 2) printf("%d\n", col[i]);
  return 0;
}
