#include <bits/stdc++.h>
using namespace std;
struct EDGE {
  int to, next;
} e[200010];
int head[2010], top, ans, in[2010], vis[2010], c[2010][2010], n;
int edge[2010][2010], anss[200010];
void add(int u, int v) {
  in[u]++;
  e[top].to = v;
  e[top].next = head[u];
  head[u] = top++;
}
void dfs(int x, int ori, int sld) {
  if (!c[x][ori]) {
    c[x][sld] = 0;
    return;
  }
  int v = c[x][ori];
  dfs(v, sld, ori);
  c[x][sld] = v;
  c[v][sld] = x;
}
void draw(int eid) {
  memset(vis, 0, sizeof(vis));
  int u = e[eid].to;
  int v = e[eid ^ 1].to;
  int i;
  for (i = 1; i <= ans; i++)
    if (c[u][i]) vis[i] = 1;
  for (i = 1; i <= ans; i++)
    if (c[v][i]) vis[i] = 1;
  int cola = 0, colb = 0;
  for (i = 1; i <= ans; i++) {
    if (!vis[i]) {
      cola = i;
      break;
    }
  }
  if (cola) {
    c[u][cola] = v;
    c[v][cola] = u;
    return;
  }
  memset(vis, 0, sizeof(vis));
  for (i = 1; i <= ans; i++)
    if (c[u][i]) vis[i] = 1;
  for (i = 1; i <= ans; i++) {
    if (!vis[i]) {
      cola = i;
      break;
    }
  }
  memset(vis, 0, sizeof(vis));
  for (i = 1; i <= ans; i++)
    if (c[v][i]) vis[i] = 1;
  for (i = 1; i <= ans; i++) {
    if (!vis[i]) {
      colb = i;
      break;
    }
  }
  dfs(v, cola, colb);
  c[u][cola] = v;
  c[v][cola] = u;
}
int main() {
  memset(head, 255, sizeof(head));
  int a, b, m;
  scanf("%d%d%d", &a, &b, &m);
  n = a + b;
  int i;
  int u, v;
  for (i = 0; i < m; i++) {
    scanf("%d%d", &u, &v);
    add(u, v + a);
    add(v + a, u);
  }
  for (i = 1; i <= a + b; i++) {
    if (in[i] > ans) ans = in[i];
  }
  for (i = 0; i < m; i++) {
    draw(i << 1);
  }
  int j;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= ans; j++) {
      if (c[i][j]) edge[i][c[i][j]] = j;
    }
  }
  for (i = 1; i <= n; i++) {
    for (j = head[i]; ~j; j = e[j].next) {
      anss[j] = edge[i][e[j].to];
    }
  }
  printf("%d\n", ans);
  for (i = 0; i < m; i++) {
    printf("%d ", anss[i << 1]);
  }
  return 0;
}
