#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int f = 1, ans = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    ans = ans * 10 + c - '0';
    c = getchar();
  }
  return f * ans;
}
const int MAXM = 1e5 + 11;
const int MAXN = 2e3 + 11;
int nex[MAXN][MAXN], M, A, B, U[MAXM], V[MAXM], d[MAXN], Ans;
int main() {
  A = read(), B = read(), M = read();
  for (int i = 1; i <= M; i++)
    U[i] = read(), V[i] = read() + A, d[U[i]]++, d[V[i]]++;
  for (int i = 1; i <= A + B; i++) Ans = max(Ans, d[i]);
  printf("%d\n", Ans);
  for (int p = 1; p <= M; p++) {
    int c1 = -1, c2 = -1, u = U[p], v = V[p];
    for (int i = 1; i <= Ans; i++)
      if (!nex[u][i]) {
        c1 = i;
        break;
      }
    for (int i = 1; i <= Ans; i++)
      if (!nex[v][i]) {
        c2 = i;
        break;
      }
    nex[u][c1] = v, nex[v][c2] = u;
    if (c1 == c2) continue;
    for (int c0 = c2, i = v; i; i = nex[i][c0], c0 ^= c1 ^ c2)
      swap(nex[i][c1], nex[i][c2]);
  }
  for (int i = 1; i <= M; i++) {
    for (int j = 1; j <= Ans; j++)
      if (nex[U[i]][j] == V[i]) {
        printf("%d ", j);
        break;
      }
  }
  printf("\n");
  return 0;
}
