#include <bits/stdc++.h>
using namespace std;
int n, m, k, ta, tb, i, ans[100005], tc, ca[2][1005];
vector<int> va[2][1005], vb[2], ve;
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int a = 0; a < k; a++) {
    scanf("%d%d", &ta, &tb);
    ta--;
    tb--;
    vb[0].push_back(ta);
    vb[1].push_back(tb);
    ca[0][ta]++;
    ca[1][tb]++;
    ans[a] = -1;
  }
  for (int a = 0; a < n; a++) i = max(i, ca[0][a]);
  for (int a = 0; a < m; a++) i = max(i, ca[1][a]);
  for (int a = 0; a < n; a++)
    for (int b = 0; b < i; b++) va[0][a].push_back(-1);
  for (int a = 0; a < m; a++)
    for (int b = 0; b < i; b++) va[1][a].push_back(-1);
  for (int a = 0; a < k; a++) {
    tc = -1;
    ta = -1;
    tb = -1;
    for (int c = 0; c < i; c++) {
      if (va[0][vb[0][a]][c] == -1 && va[1][vb[1][a]][c] == -1) {
        tc = c;
        break;
      } else if (va[1][vb[1][a]][c] == -1)
        ta = c;
      else if (va[0][vb[0][a]][c] == -1)
        tb = c;
    }
    if (tc != -1) tb = tc;
    ve.clear();
    ve.push_back(a);
    while (1) {
      tc = va[ve.size() % 2][vb[ve.size() % 2][ve.back()]]
             [(ve.size() & 1) ? tb : ta];
      if (tc == -1) break;
      ve.push_back(tc);
    }
    for (int c = 0; c < ve.size(); c++)
      if (ans[ve[c]] != -1) {
        va[c % 2][vb[c % 2][ve[c]]][ans[ve[c]]] = -1;
        va[1 - c % 2][vb[1 - c % 2][ve[c]]][ans[ve[c]]] = -1;
      }
    for (int c = 0; c < ve.size(); c++) {
      ans[ve[c]] = (c & 1) ? ta : tb;
      va[c % 2][vb[c % 2][ve[c]]][(c & 1) ? ta : tb] = ve[c];
      va[1 - c % 2][vb[1 - c % 2][ve[c]]][(c & 1) ? ta : tb] = ve[c];
    }
  }
  printf("%d\n", i);
  for (int a = 0; a < k; a++)
    printf("%d%c", ans[a] + 1, a == k - 1 ? '\n' : ' ');
  return 0;
}
