#include <bits/stdc++.h>
using namespace std;
const int N = 1100, inf = 0x3f3f3f3f;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9')
    x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
  return x * f;
}
int n, m, k, w[N], a[N], b[N], c[N];
int num[N];
vector<pair<int, int> > mp[N];
int du[N], fir[N], cnt;
struct node {
  int nxt, to, id;
} e[N << 2];
void add(int u, int v, int id) {
  e[++cnt].nxt = fir[u];
  fir[u] = cnt;
  e[cnt].to = v, e[cnt].id = id;
};
bool vis[N << 1];
void dfs1(int u) {
  vis[u] = 1;
  for (int i = fir[u]; i; i = e[i].nxt) {
    if (!vis[e[i].to]) dfs1(e[i].to);
  }
}
int s[N], top;
void dfs2(int u, int id) {
  for (int &i = fir[u]; i; i = e[i].nxt) {
    if (!vis[i >> 1]) vis[i >> 1] = 1, dfs2(e[i].to, e[i].id);
  }
  s[++top] = id;
}
void re_color(int A, int B) {
  for (int i = 0; i <= n; ++i) fir[i] = du[i] = vis[i] = 0;
  cnt = 1;
  for (int i = 1; i <= m; ++i)
    if (c[i] == A || c[i] == B)
      add(a[i], b[i], i), add(b[i], a[i], i), ++du[a[i]], ++du[b[i]];
  for (int i = 1; i <= n; ++i) {
    if (du[i] & 1) {
      add(0, i, 0), add(i, 0, 0);
      ++du[i], ++du[0];
      if (!vis[i]) dfs1(i);
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (!(du[i] & 1) && !vis[i]) {
      add(0, i, 0), add(i, 0, 0);
      add(0, i, 0), add(i, 0, 0);
      du[i] += 2, du[0] += 2;
      dfs1(i);
    }
  }
  for (int i = cnt >> 1; i >= 1; --i) vis[i] = 0;
  dfs2(0, 0);
  int col = 0;
  while (top) {
    c[s[top]] = (col ? A : B);
    --top;
    col ^= 1;
  }
}
int main() {
  srand((unsigned)time(0) + 114514);
  n = read(), m = read(), k = read();
  for (int i = 1; i <= n; ++i) w[i] = read();
  for (int i = 1; i <= m; ++i) {
    a[i] = read(), b[i] = read();
    mp[a[i]].push_back(make_pair(b[i], i));
    mp[b[i]].push_back(make_pair(a[i], i));
    c[i] = rand() % k + 1;
  }
  while (true) {
    int flag = 1;
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= k; ++j) num[j] = 0;
      for (int j = 0; j < mp[i].size(); ++j) {
        ++num[c[mp[i][j].second]];
      }
      int mx = 0, mn = inf, A, B;
      for (int j = 1; j <= k; ++j) {
        if (num[j] > mx) {
          mx = num[j];
          A = j;
        }
        if (num[j] < mn) {
          mn = num[j];
          B = j;
        }
      }
      if (mx - mn > 2) re_color(A, B), flag = 0;
    }
    if (flag) break;
  }
  for (int i = 1; i <= m; ++i) printf("%d\n", c[i]);
  return 0;
}
