#include <bits/stdc++.h>
using namespace std;
int a, b, m, d;
vector<pair<int, int>> edge;
vector<int> G[2010];
int color[100010];
set<int> st[2010];
map<pair<int, int>, int> id;
int rec[2010][1010];
void fill(int a, int b, int c) {
  if (a > b) swap(a, b);
  color[id[{a, b}]] = c;
  rec[a][c] = b;
  rec[b][c] = a;
  st[a].erase(c);
  st[b].erase(c);
}
void go(int x, int y, int c1, int c2) {
  int nxt = rec[y][c1];
  fill(x, y, c1);
  if (st[nxt].count(c2)) {
    st[nxt].insert(c1);
    rec[nxt][c1] = 0;
  } else {
    go(y, nxt, c2, c1);
  }
  fill(y, nxt, c2);
}
void decide(int x, int y) {
  int c1 = *(st[x].begin());
  int c2 = *(st[y].begin());
  if (rec[y][c1] == 0) {
    fill(x, y, c1);
    return;
  }
  if (rec[x][c2] == 0) {
    fill(x, y, c2);
    return;
  }
  go(x, y, c1, c2);
}
int main() {
  cin >> a >> b >> m;
  for (int i = 0; i < m; i++) {
    int x = 0, y = 0;
    cin >> x >> y;
    y += 1000;
    edge.push_back({x, y});
    G[x].push_back(y);
    G[y].push_back(x);
    id[edge[i]] = i;
  }
  random_shuffle(edge.begin(), edge.end());
  for (int i = 1; i <= 2000; i++) d = max(d, (int)G[i].size());
  for (int i = 1; i <= 2000; i++)
    for (int j = 1; j <= d; j++) st[i].insert(j);
  for (int i = 0; i < m; i++) {
    decide(edge[i].first, edge[i].second);
  }
  cout << d << endl;
  for (int i = 0; i < m; i++) cout << color[i] << " \n"[i == m - 1];
  return 0;
}
