#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T read(register T& t) {
  register T f = 1;
  register char ch = getchar();
  t = 0;
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -f;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') t = t * 10 + ch - '0', ch = getchar();
  t *= f;
  return t;
}
template <typename T, typename... Args>
inline void read(T& t, Args&... args) {
  read(t);
  read(args...);
}
const long long p = 998244353;
inline long long power(register long long x, register long long k = p - 2) {
  register long long re = 1;
  for (; k; k >>= 1, x = x * x % p)
    if (k & 1) re = re * x % p;
  return re;
}
int a, b, n;
int u[100005], v[100005];
int deg[20005];
int col[2005][10005];
int main() {
  read(a, b, n);
  for (int i = 1; i <= n; i++)
    read(u[i], v[i]), v[i] += a, deg[u[i]]++, deg[v[i]]++;
  int ans = 0;
  for (int i = 1; i <= a + b; i++) ans = max(ans, deg[i]);
  printf("%d\n", ans);
  for (int i = 1; i <= n; i++) {
    int col1, col2;
    for (col1 = 1; col[u[i]][col1]; col1++)
      ;
    for (col2 = 1; col[v[i]][col2]; col2++)
      ;
    col[u[i]][col1] = v[i];
    col[v[i]][col2] = u[i];
    if (col1 == col2) continue;
    for (int col0 = col2, x = v[i]; x; x = col[x][col0], col0 ^= col1 ^ col2)
      swap(col[x][col1], col[x][col2]);
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= ans; j++)
      if (col[u[i]][j] == v[i]) printf("%d ", j);
  return 0;
}
