#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const long long N = 5555;
const long long K = 222;
pair<long long, long long> g[2][N][K];
long long ans[N], w[N];
long long deg[2][N], curV[2][N];
long long n, m, k, t;
void dfs(long long part, long long v, const vector<long long> c) {
  long long u = g[part][v][c[part]].first;
  swap(g[part][v][c[part]], g[part][v][c[part ^ 1]]);
  if (u == -1) {
    return;
  }
  dfs(part ^ 1, u, c);
}
void add_edge(long long v, long long u, long long id) {
  long long c1 = -1, c2 = -1;
  auto set_clr = [&]() {
    g[0][v][c2] = {u, id};
    g[1][u][c2] = {v, id};
  };
  for (long long i = 0; i < t; i++) {
    if (g[0][v][i].first == -1) {
      c2 = i;
    }
    if (g[1][u][i].first == -1) {
      c1 = i;
    }
    if (c1 != -1 && c1 == c2) {
      set_clr();
      return;
    }
  }
  assert(c1 != -1 && c2 != -1);
  dfs(1, u, {c1, c2});
  set_clr();
}
signed main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  for (long long i = 0; i < 2; i++) {
    for (long long j = 0; j < N; j++) {
      for (long long k = 0; k < K; k++) {
        g[i][j][k] = {-1, -1};
      }
    }
  }
  cin >> n >> k >> t;
  m = n;
  for (long long i = 0; i < n; i++) {
    cin >> w[i];
  }
  vector<pair<long long, long long>> edges(k);
  long long cur_size1 = 0, cur_size2 = 0;
  long long res = 0;
  for (long long i = 0; i < k; i++) {
    long long v, u;
    cin >> v >> u;
    v--;
    u--;
    edges[i] = {v, u};
    if (deg[0][v] % t == 0) {
      curV[0][v] = cur_size1++;
    }
    if (deg[1][u] % t == 0) {
      curV[1][u] = cur_size2++;
    }
    deg[0][v]++;
    deg[1][u]++;
    add_edge(curV[0][v], curV[1][u], i);
  }
  for (long long v = 0; v < cur_size1; v++) {
    for (long long clr = 0; clr < t; clr++) {
      if (g[0][v][clr].first == -1) continue;
      ans[g[0][v][clr].second] = clr + 1;
    }
  }
  for (long long i = 0; i < k; i++) {
    cout << ans[i] << ' ';
  }
  cout << '\n';
}
