#include <bits/stdc++.h>
using namespace std;
const int N = 110, M = 1010, K = 55;
int n, m, k, u[N + M], v[N + M], c[M], w[N + M], dex[N][N], cnt[N][K];
bool mark_v[N], mark_e[N + M];
vector<int> vec, G[N], nei[N];
mt19937 LODB(chrono::steady_clock::now().time_since_epoch().count());
void input() {
  cin >> n >> m >> k;
  for (int i = 0; i < n; i++) cin >> w[i];
  for (int i = 0; i < m; i++) {
    cin >> u[i] >> v[i];
    u[i]--, v[i]--;
    dex[u[i]][v[i]] = dex[v[i]][u[i]] = i;
  }
}
void big_k() {
  for (int i = 0; i < m; i++) {
    int d = abs(u[i] - v[i]);
    cout << min(d, n - d) << ' ';
  }
  exit(0);
}
void color() {
  for (int i = 0; i < m; i++) {
    c[i] = LODB() % k;
    cnt[u[i]][c[i]]++;
    cnt[v[i]][c[i]]++;
  }
}
void print() {
  for (int i = 0; i < m; i++) cout << ++c[i] << '\n';
  exit(0);
}
void dfs(int v) {
  mark_v[v] = true;
  vec.push_back(v);
  for (int u : G[v])
    if (mark_v[u] == false) dfs(u);
}
void add(int U, int V, int x) {
  nei[U].push_back(x);
  nei[V].push_back(x);
  w[x] = (u[x] = U) ^ (v[x] = V);
}
void build(int a, int b) {
  for (int i = 0; i <= n; i++) G[i], nei[i].clear();
  for (int i = 0; i < m; i++)
    if (c[i] == a || c[i] == b) {
      cnt[u[i]][c[i]]--;
      cnt[v[i]][c[i]]--;
      G[u[i]].push_back(v[i]);
      G[v[i]].push_back(u[i]);
      add(u[i], v[i], i);
    }
  int last = m;
  memset(mark_v, false, sizeof mark_v);
  for (int v = 0; v < n; v++)
    if (mark_v[v] == false) {
      vec.clear();
      dfs(v);
      for (int u : vec)
        if (nei[u].size() & 1) add(u, n, last++);
    }
}
void tour(int v) {
  while (nei[v].size()) {
    int x = nei[v].back();
    nei[v].pop_back();
    if (mark_e[x]) continue;
    mark_e[x] = true;
    tour(w[x] ^ v);
  }
  vec.push_back(v);
}
void recolor(int a, int b) {
  for (int i = 1; i < vec.size(); i++) {
    int u = vec[i - 1], v = vec[i];
    if (max(u, v) != n) {
      int C = (i & 1 ? a : b);
      cnt[u][C]++;
      cnt[v][C]++;
      c[dex[u][v]] = C;
    }
  }
}
void act(int a, int b) {
  build(a, b);
  memset(mark_e, false, sizeof mark_e);
  for (int v = 0; v <= n; v++) {
    vec.clear();
    tour(v);
    recolor(a, b);
  }
}
void solve() {
  color();
  bool done = false;
  while (done == false) {
    done = true;
    for (int v = 0; v < n; v++) {
      int a = min_element(cnt[v], cnt[v] + k) - cnt[v],
          b = max_element(cnt[v], cnt[v] + k) - cnt[v];
      if (cnt[v][b] - cnt[v][a] > 2) {
        act(a, b);
        done = false;
        break;
      }
    }
  }
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  input();
  if (k >= n / 2) big_k();
  solve();
  print();
}
