#include <bits/stdc++.h>
using namespace std;
const int maxn = 2010;
const int maxm = 1e5 + 10;
int f[maxn][maxn], nxt[maxn][maxn], deg[maxn];
int a[maxm], b[maxm];
void find(int y, int c2, int c1) {
  int nx = nxt[y][c2];
  if (nx == 0) {
    nxt[y][c1] = 0;
    return;
  }
  find(nx, c1, c2);
  f[nx][y] = f[y][nx] = c1;
  nxt[nx][c1] = y;
  nxt[y][c1] = nx;
}
int main() {
  int n1, n2, m, n;
  scanf("%d %d %d", &n1, &n2, &m);
  n = n1 + n2;
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", &a[i], &b[i]);
    b[i] += n1;
    ++deg[a[i]], ++deg[b[i]];
  }
  int ans = 0;
  for (int i = 1; i <= n; i++) ans = max(ans, deg[i]);
  for (int i = 1; i <= m; i++) {
    int x = a[i], y = b[i], z = -1;
    int c1, c2;
    for (int c = 1; c <= ans; c++)
      if (!nxt[x][c] && !nxt[y][c]) {
        z = c;
        break;
      } else if (nxt[x][c] && !nxt[y][c])
        c1 = c;
      else if (nxt[y][c] && !nxt[x][c])
        c2 = c;
    if (z != -1) {
      f[x][y] = f[y][x] = z;
      nxt[x][z] = y;
      nxt[y][z] = x;
      continue;
    }
    find(y, c2, c1);
    f[x][y] = f[y][x] = c2;
    nxt[x][c2] = y;
    nxt[y][c2] = x;
  }
  printf("%d\n", ans);
  for (int i = 1; i <= m; i++) printf("%d ", f[a[i]][b[i]]);
  printf("\n");
  return 0;
}
