#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int A[4506];
pair<int, int> ed[4506];
map<pair<int, int>, int> M;
int deg[4506], sz[4506], st[4506], cu[4506];
vector<pair<int, int> > G[4506];
void doit(int pr, int u, int fd, int go) {
  for (auto& t : G[u])
    if (t.first == fd) {
      t.first = go;
      doit(u, t.second, go, fd);
    }
  for (auto& t : G[u])
    if (t.second == pr) t.first = fd;
}
int as[4506];
void solve() {
  cin >> n >> m >> k;
  for (int i = (1), iend = (n); i <= iend; ++i) scanf("%*d");
  for (int i = (1), iend = (m); i <= iend; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    if (u > v) swap(u, v);
    ed[i] = make_pair(u, v + n);
    ++deg[u], ++deg[v + n];
  }
  n = n << 1;
  st[0] = 1;
  for (int i = (1), iend = (n); i <= iend; ++i)
    sz[i] = (deg[i] + k - 1) / k, st[i] = st[i - 1] + sz[i - 1];
  for (int i = (1), iend = (m); i <= iend; ++i) {
    int u = ed[i].first, v = ed[i].second;
    G[st[u]].emplace_back(make_pair(0x3f3f3f3f, st[v]));
    G[st[v]].emplace_back(make_pair(0x3f3f3f3f, st[u]));
    ed[i] = make_pair(st[u], st[v]);
    M[ed[i]] = i;
    ++cu[u], ++cu[v];
    if (cu[u] == k) ++st[u], cu[u] = 0;
    if (cu[v] == k) ++st[v], cu[v] = 0;
  }
  for (int i = (1), iend = (m); i <= iend; ++i) {
    int u = ed[i].first, v = ed[i].second, fuck = 0, kcuf = 0;
    sort((G[u]).begin(), (G[u]).end()), sort((G[v]).begin(), (G[v]).end());
    for (int i = 0; i < G[u].size(); ++i)
      if (i + 1 != G[u][i].first) {
        fuck = i + 1;
        break;
      }
    for (int i = 0; i < G[v].size(); ++i)
      if (i + 1 != G[v][i].first) {
        kcuf = i + 1;
        break;
      }
    for (auto& t : G[u])
      if (t.second == v) t.first = fuck;
    doit(u, v, fuck, kcuf);
  }
  for (int i = (1), iend = (st[n]); i <= iend; ++i)
    for (auto t : G[i])
      if (i < t.second) {
        as[M[make_pair(i, t.second)]] = t.first;
      }
  for (int i = (1), iend = (m); i <= iend; ++i) printf("%d\n", as[i]);
}
signed main() { solve(); }
