#include <bits/stdc++.h>
template <typename T>
inline T max(T a, T b) {
  return a > b ? a : b;
}
template <typename T>
inline T min(T a, T b) {
  return a < b ? a : b;
}
template <typename T>
inline T abs(T a) {
  return a > 0 ? a : -a;
}
template <typename T>
inline bool repr(T &a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
inline bool repl(T &a, T b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline T gcd(T a, T b) {
  T t;
  if (a < b) {
    while (a) {
      t = a;
      a = b % a;
      b = t;
    }
    return b;
  } else {
    while (b) {
      t = b;
      b = a % b;
      a = t;
    }
    return a;
  }
}
template <typename T>
inline T sqr(T x) {
  return x * x;
}
struct Cg {
  __attribute__((always_inline)) inline char operator()() { return getchar(); }
};
struct Cp {
  __attribute__((always_inline)) inline void operator()(char x) { putchar(x); }
};
__attribute__((always_inline)) inline bool IS(char x) {
  return x == 10 || x == 13 || x == ' ';
}
template <typename T>
struct Fr {
  T P;
  __attribute__((always_inline)) inline Fr &operator,(int &x) {
    x = 0;
    unsigned char t = P();
    while ((t < '0' || t > '9') && t != '-') t = P();
    bool f = 0;
    if (t == '-') t = P(), f = 1;
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    if (f) x = -x;
    return *this;
  }
  __attribute__((always_inline)) inline operator int() {
    int x;
    *this, x;
    return x;
  }
  __attribute__((always_inline)) inline Fr &operator,(long long &x) {
    x = 0;
    unsigned char t = P();
    while ((t < '0' || t > '9') && t != '-') t = P();
    bool f = 0;
    if (t == '-') t = P(), f = 1;
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    if (f) x = -x;
    return *this;
  }
  __attribute__((always_inline)) inline operator long long() {
    long long x;
    *this, x;
    return x;
  }
  __attribute__((always_inline)) inline Fr &operator,(char &x) {
    for (x = P(); IS(x); x = P())
      ;
    return *this;
  }
  __attribute__((always_inline)) inline operator char() {
    char x;
    *this, x;
    return x;
  }
  __attribute__((always_inline)) inline Fr &operator,(char *x) {
    char t = P();
    for (; IS(t); t = P())
      ;
    if (~t) {
      for (; !IS(t) && ~t; t = P()) *x++ = t;
    }
    *x++ = 0;
    return *this;
  }
  __attribute__((always_inline)) inline Fr &operator,(double &x) {
    x = 0;
    unsigned char t = P();
    while ((t < '0' || t > '9') && t != '-') t = P();
    bool f = 0;
    if (t == '-') t = P(), f = 1;
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    if (t == '.') {
      double u = 0.1;
      for (t = P(); t >= '0' && t <= '9'; t = P(), u *= 0.1) x += u * (t - '0');
    }
    if (f) x = -x;
    return *this;
  }
  __attribute__((always_inline)) inline operator double() {
    double x;
    *this, x;
    return x;
  }
  __attribute__((always_inline)) inline Fr &operator,(long double &x) {
    x = 0;
    unsigned char t = P();
    while ((t < '0' || t > '9') && t != '-') t = P();
    bool f = 0;
    if (t == '-') t = P(), f = 1;
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    if (t == '.') {
      double u = 0.1;
      for (t = P(); t >= '0' && t <= '9'; t = P(), u *= 0.1) x += u * (t - '0');
    }
    if (f) x = -x;
    return *this;
  }
  __attribute__((always_inline)) inline operator long double() {
    long double x;
    *this, x;
    return x;
  }
  __attribute__((always_inline)) inline Fr &operator,(unsigned int &x) {
    x = 0;
    unsigned char t = P();
    while (t < '0' || t > '9') t = P();
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    return *this;
  }
  __attribute__((always_inline)) inline operator unsigned int() {
    unsigned int x;
    *this, x;
    return x;
  }
  __attribute__((always_inline)) inline Fr &operator,(unsigned long long &x) {
    x = 0;
    unsigned char t = P();
    while (t < '0' || t > '9') t = P();
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    return *this;
  }
  __attribute__((always_inline)) inline operator unsigned long long() {
    unsigned long long x;
    *this, x;
    return x;
  }
};
Fr<Cg> in;
template <typename T>
struct Fw {
  T P;
  __attribute__((always_inline)) inline Fw &operator,(int x) {
    if (x) {
      if (x < 0) P('-'), x = -x;
      unsigned char s[10], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator()(int x) {
    if (x) {
      if (x < 0) P('-'), x = -x;
      unsigned char s[10], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator,(unsigned int x) {
    if (x) {
      unsigned char s[10], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator()(unsigned int x) {
    if (x) {
      unsigned char s[10], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator,(long long x) {
    if (x) {
      if (x < 0) P('-'), x = -x;
      unsigned char s[19], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator()(long long x) {
    if (x) {
      if (x < 0) P('-'), x = -x;
      unsigned char s[19], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator,(unsigned long long x) {
    if (x) {
      unsigned char s[20], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator()(unsigned long long x) {
    if (x) {
      unsigned char s[20], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator,(char x) {
    P(x);
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator()(char x) {
    P(x);
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator,(const char *x) {
    while (*x) P(*x++);
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator()(const char *x) {
    while (*x) P(*x++);
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator()(double x, int y) {
    if (y) {
      double t = 0.5;
      for (int i = y; i--;) t *= 0.1;
      if (x >= 0)
        x += t;
      else
        x -= t, P('-');
      *this, (long long)(abs(x));
      P('.');
      if (x < 0) x = -x;
      while (y--) {
        x *= 10;
        x -= floor(x * 0.1) * 10;
        P(((int)x) % 10 + '0');
      }
    } else if (x >= 0)
      *this, (long long)(x + 0.5);
    else
      *this, (long long)(x - 0.5);
    ;
    return *this;
  }
  __attribute__((always_inline)) inline Fw &operator()(long double x, int y) {
    if (y) {
      double t = 0.5;
      for (int i = y; i--;) t *= 0.1;
      if (x >= 0)
        x += t;
      else
        x -= t, P('-');
      *this, (long long)(abs(x));
      P('.');
      if (x < 0) x = -x;
      while (y--) {
        x *= 10;
        x -= floor(x * 0.1) * 10;
        P(((int)x) % 10 + '0');
      }
    } else if (x >= 0)
      *this, (long long)(x + 0.5);
    else
      *this, (long long)(x - 0.5);
    ;
    return *this;
  }
};
Fw<Cp> out;
std::mt19937 ran(11);
int n, m, k, p, c[105], id[105][105], ir[105][105], co[105][105];
bool inq[105];
std::queue<int> q;
std::pair<int, int> e[1005];
struct seg {
  int mi[231], ma[231], v[105];
  inline void init() {
    memset(mi, 0x3f, sizeof(mi));
    for (int i = 1, iend = k; i <= iend; i++) mi[i + p] = 0;
  }
  inline void modify(int x, int y) {
    mi[x + p] = ma[x + p] = v[x] += y;
    for (x += p; x ^ 1; x >>= 1)
      mi[x >> 1] = min(mi[x], mi[x ^ 1]), ma[x >> 1] = max(ma[x], ma[x ^ 1]);
  }
} f[105];
inline bool chk(int x) { return f[x].ma[1] - f[x].mi[1] > 2; }
inline void add(int x) {
  if (!inq[x] && chk(x)) q.push(x);
}
inline void _modify(int x, int y, int v) {
  f[x].modify(co[x][id[x][y]], -1);
  co[x][id[x][y]] = v;
  f[x].modify(co[x][id[x][y]], 1);
}
inline void modify(int x, int y, int v) {
  _modify(x, y, v), _modify(y, x, v);
  add(x), add(y);
}
inline void work(int x) {
  if (!chk(x)) return;
  int mi = f[x].mi[1], ma = f[x].ma[1];
  if (ran() & 1) {
    int tc = 0, ta, tb;
    for (int i = 1, iend = c[x]; i <= iend; i++)
      if (f[x].v[co[x][i]] >= mi + 2) tc++;
    tc = ran() % tc;
    for (int i = 1, iend = c[x]; i <= iend; i++)
      if (f[x].v[co[x][i]] >= mi + 2) {
        if (!tc--) {
          ta = i;
          break;
        }
      }
    tc = 0;
    for (int i = 1, iend = k; i <= iend; i++)
      if (f[x].v[i] == mi) tc++;
    tc = ran() % tc;
    for (int i = 1, iend = k; i <= iend; i++)
      if (f[x].v[i] == mi) {
        if (!tc--) {
          tb = i;
          break;
        }
      }
    modify(x, ir[x][ta], tb);
  } else {
    int tc = 0, ta, tb;
    for (int i = 1, iend = c[x]; i <= iend; i++)
      if (f[x].v[co[x][i]] == ma) tc++;
    tc = ran() % tc;
    for (int i = 1, iend = c[x]; i <= iend; i++)
      if (f[x].v[co[x][i]] == ma) {
        if (!tc--) {
          ta = i;
          break;
        }
      }
    tc = 0;
    for (int i = 1, iend = k; i <= iend; i++)
      if (f[x].v[i] <= ma - 2) tc++;
    tc = ran() % tc;
    for (int i = 1, iend = k; i <= iend; i++)
      if (f[x].v[i] <= ma - 2) {
        if (!tc--) {
          tb = i;
          break;
        }
      }
    modify(x, ir[x][ta], tb);
  }
}
int main() {
  in, n, m, k;
  k = min(n, k);
  for (p = 1; p < k + 2; p <<= 1)
    ;
  for (int i = 1, iend = n; i <= iend; i++) (int)in;
  for (int i = 1, iend = m; i <= iend; i++) {
    int x, y;
    in, x, y;
    id[x][y] = id[y][x] = 1;
    co[x][y] = co[y][x] = ran() % k + 1;
    e[i] = std::make_pair(x, y);
  }
  for (int i = 1, iend = n; i <= iend; i++) f[i].init();
  for (int i = 1, iend = n; i <= iend; i++)
    for (int j = 1, jend = k; j <= jend; j++) f[i].modify(j, 0);
  for (int i = 1, iend = n; i <= iend; i++)
    for (int j = 1, jend = n; j <= jend; j++)
      if (id[i][j]) {
        id[i][j] = ++c[i];
        ir[i][c[i]] = j;
        co[i][c[i]] = co[i][j];
        f[i].modify(co[i][j], 1);
      }
  for (int i = 1, iend = n; i <= iend; i++) add(i);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    work(x);
  }
  for (int i = 1, iend = m; i <= iend; i++) {
    out, co[e[i].first][id[e[i].first][e[i].second]], '\n';
  }
}
