#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
const int maxn = 1000, maxm = 100000;
int linkx[maxn + 5][maxn + 5], linky[maxn + 5][maxn + 5];
int id[maxn + 5][maxn + 5];
int ans[maxm + 5];
int n0, n1, m;
int main() {
  memset(linkx, -1, sizeof linkx);
  memset(linky, -1, sizeof linky);
  scanf("%d%d%d", &n0, &n1, &m);
  for (int i = (0), _end_ = (m); i < _end_; ++i) {
    int first, second;
    scanf("%d%d", &first, &second), --first, --second;
    id[first][second] = i;
    int u = 0, v = 0;
    while (linkx[u][first] != -1) ++u;
    while (linky[v][second] != -1) ++v;
    if (u == v)
      linkx[u][first] = second, linky[u][second] = first;
    else {
      int lst = first;
      int now = second;
      linkx[u][first] = second;
      while (1) {
        int tmp = linky[u][now];
        linky[u][now] = lst;
        linky[v][now] = tmp;
        if (tmp == -1) break;
        int tmp0 = linkx[v][tmp];
        linkx[v][tmp] = now;
        linkx[u][tmp] = tmp0;
        if (tmp0 == -1) break;
        lst = tmp, now = tmp0;
      }
    }
  }
  for (int i = (0), _end_ = (max(n0, n1)); i < _end_; ++i)
    for (int j = (0), _end_ = (n0); j < _end_; ++j)
      if (linkx[i][j] != -1) ans[id[j][linkx[i][j]]] = i + 1;
  printf("%d\n", *max_element(ans, ans + m));
  for (int i = (0), _end_ = (m); i < _end_; ++i) printf("%d ", ans[i]);
  return 0;
}
