#include <bits/stdc++.h>
using namespace std;
const int Nmax = 1005, Mmax = 1e5 + 5;
int n, m, edges, i, C = 0, x, y;
int color[Mmax], edge[Mmax][2], go1[Nmax][Nmax], go2[Nmax][Nmax], grad1[Nmax],
    grad2[Nmax];
void swap_colors1(int node, int c1, int c2);
void swap_colors2(int node, int c1, int c2);
void swap_colors1(int node, int c1, int c2) {
  if (!go1[node][c2]) {
    swap(go1[node][c1], go1[node][c2]);
    return;
  }
  int x = edge[go1[node][c2]][1];
  swap_colors2(x, c1, c2);
  color[go1[node][c2]] = c1;
  swap(go1[node][c1], go1[node][c2]);
}
void swap_colors2(int node, int c1, int c2) {
  if (!go2[node][c1]) {
    swap(go2[node][c1], go2[node][c2]);
    return;
  }
  int x = edge[go2[node][c1]][0];
  swap_colors1(x, c1, c2);
  color[go2[node][c1]] = c2;
  swap(go2[node][c1], go2[node][c2]);
}
void fix_color(int id) {
  int i, x = edge[id][0], y = edge[id][1], color1, color2;
  for (i = 1; i <= C; ++i) {
    if (!go1[x][i] && !go2[y][i]) {
      color[id] = i;
      go1[x][i] = id;
      go2[y][i] = id;
      return;
    }
    if (!go1[x][i]) color1 = i;
    if (!go2[y][i]) color2 = i;
  }
  swap_colors2(y, color1, color2);
  color[id] = color1;
  go1[x][color1] = id;
  go2[y][color1] = id;
}
int main() {
  cin >> n >> m >> edges;
  for (i = 1; i <= edges; ++i) {
    cin >> x >> y;
    edge[i][0] = x, edge[i][1] = y;
    grad1[x]++, grad2[y]++;
  }
  for (i = 1; i <= n; ++i) C = max(C, grad1[i]);
  for (i = 1; i <= m; ++i) C = max(C, grad2[i]);
  cout << C << '\n';
  for (i = 1; i <= edges; ++i) fix_color(i);
  for (i = 1; i <= edges; ++i) cout << color[i] << ' ';
  return 0;
}
