#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5, M = 1e5 + 5;
int a, b, m, d, cnt, degree[N << 1], last[N << 1], used[N << 1][N << 1];
struct edge {
  int y, last;
} E[M << 1];
struct node {
  int x, y, color;
} nd[M];
void link(int x, int y) {
  E[cnt] = (edge){y, last[x]}, last[x] = cnt++, ++degree[y];
  E[cnt] = (edge){x, last[y]}, last[y] = cnt++, ++degree[x];
}
void modify(int pos, int c1, int c2) {
  int x = used[pos][c1], y = E[x].y;
  if (!~used[y][c2])
    used[y][c1] = -1;
  else
    modify(y, c2, c1);
  nd[(x >> 1) + 1].color = c2, used[y][c2] = x ^ 1, used[pos][c2] = x;
}
int main() {
  ios::sync_with_stdio(0);
  memset(used, -1, sizeof(used)), memset(last, -1, sizeof(last)),
      cin >> a >> b >> m;
  for (int i = 1; i <= m; ++i)
    cin >> nd[i].x >> nd[i].y, nd[i].y += a, link(nd[i].x, nd[i].y);
  for (int i = 1; i <= a + b; ++i)
    if (degree[i] > d) d = degree[i];
  for (int i = 1; i <= m; ++i) {
    for (int j = 1; !nd[i].color && j <= d; ++j)
      if (!~used[nd[i].x][j] && !~used[nd[i].y][j])
        used[nd[i].x][j] = i * 2 - 2, used[nd[i].y][j] = i * 2 - 1,
        nd[i].color = j;
    if (!nd[i].color) {
      int c1, c2;
      for (c1 = 1; ~used[nd[i].x][c1] && c1 <= d; ++c1)
        ;
      for (c2 = 1; ~used[nd[i].y][c2] && c2 <= d; ++c2)
        ;
      modify(nd[i].y, c1, c2), used[nd[i].x][c1] = i * 2 - 2,
                               used[nd[i].y][c1] = i * 2 - 1, nd[i].color = c1;
    }
  }
  cout << d << endl;
  for (int i = 1; i <= m; ++i) cout << nd[i].color << ' ';
}
