#include <bits/stdc++.h>
using namespace std;
int n, m, k, t[200005], a[1005][5], g, nx[200005], te, t1, t2, c, d[200005],
    d1[2005][1005], p1[2005], p2[2005][1005], h[2005], ans;
struct node {
  int x, y;
} d2[2005], d4[2005][1005];
void add() {
  te++;
  d[te] = t1, t[te] = t2, nx[te] = h[t1];
  h[t1] = te;
  return;
}
inline bool cmp(node x, node y) { return x.y > y.y; }
int main() {
  scanf("%d%d%d", &n, &m, &k);
  memset(h, 0, sizeof(h));
  te = 0;
  memset(a, 0, sizeof(a));
  for (int i = 1; i <= k; i++) {
    scanf("%d%d", &t1, &t2);
    a[t1][1]++, a[t2][2]++;
    if (a[t1][1] > a[c][1] && a[t1][1] > a[c][2]) {
      c = t1;
    }
    if (a[t2][2] > a[c][1] && a[t2][2] > a[c][2]) {
      c = t2;
    }
    t2 += n;
    add();
  }
  c = max(a[c][1], a[c][2]);
  printf("%d\n", c);
  memset(d1, 0, sizeof(d1));
  for (int j = 1; j <= k; j++) {
    int i = d[j], l = t[j], x1, x2;
    for (int p = 1; p <= c; p++) {
      if (d1[i][p] == 0) {
        x1 = p;
        break;
      }
    }
    for (int p = 1; p <= c; p++) {
      if (d1[l][p] == 0) {
        x2 = p;
        break;
      }
    }
    d1[i][x1] = l, d1[l][x2] = i;
    if (x1 == x2) continue;
    for (int y = x2, z = l; z; z = d1[z][y], y ^= (x1 ^ x2)) {
      swap(d1[z][x1], d1[z][x2]);
    }
  }
  for (int i = 1; i <= k; i++) {
    for (int j = 1; j <= c; j++) {
      if (d1[d[i]][j] == t[i]) {
        printf("%d ", j);
        break;
      }
    }
  }
  return 0;
}
