#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
void solve() {
  long long int a, b, m;
  cin >> a >> b >> m;
  vector<pair<long long int, long long int>> edge(m);
  vector<long long int> degA(a);
  vector<long long int> degB(b);
  long long int maxDeg = 0;
  for (long long int i = 0; i < m; i++) {
    cin >> edge[i].first >> edge[i].second;
    edge[i].first--;
    edge[i].second--;
    degA[edge[i].first]++;
    degB[edge[i].second]++;
    maxDeg = max({maxDeg, degA[edge[i].first], degB[edge[i].second]});
  }
  cout << maxDeg << '\n';
  vector<vector<long long int>> color(a, vector<long long int>(b));
  vector<vector<long long int>> AtoB(a, vector<long long int>(maxDeg + 1, -1));
  vector<vector<long long int>> BtoA(b, vector<long long int>(maxDeg + 1, -1));
  function<void(long long int, long long int, long long int, long long int)>
      Color = [&](long long int u, long long int v, long long int c1,
                  long long int c2) {
        AtoB[u][c1] = -1;
        BtoA[v][c1] = -1;
        if (AtoB[u][c2] != -1) {
          Color(u, AtoB[u][c2], c2, c1);
        }
        if (BtoA[v][c2] != -1) {
          Color(BtoA[v][c2], v, c2, c1);
        }
        color[u][v] = c2;
        AtoB[u][c2] = v;
        BtoA[v][c2] = u;
      };
  vector<bool> done(m);
  for (long long int i = 0; i < m; i++) {
    long long int u = edge[i].first;
    long long int v = edge[i].second;
    for (long long int c = 1; c < maxDeg + 1; c++) {
      if (AtoB[u][c] == -1 && BtoA[v][c] == -1) {
        color[u][v] = c;
        AtoB[u][c] = v;
        BtoA[v][c] = u;
        done[i] = true;
        break;
      }
    }
    if (!done[i]) {
      long long int c1, c2;
      for (long long int c = 1; c < maxDeg + 1; c++) {
        if (AtoB[u][c] != -1 && BtoA[v][c] == -1) {
          c1 = c;
        }
        if (AtoB[u][c] == -1 && BtoA[v][c] != -1) {
          c2 = c;
        }
      }
      Color(u, AtoB[u][c1], c1, c2);
      color[u][v] = c1;
      AtoB[u][c1] = v;
      BtoA[v][c1] = u;
    }
  }
  for (long long int i = 0; i < m; i++) {
    long long int u = edge[i].first;
    long long int v = edge[i].second;
    cout << color[u][v] << " ";
  }
  cout << '\n';
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  solve();
  cerr << "Time : "
       << 1000 * ((long double)clock()) / (long double)CLOCKS_PER_SEC << "ms\n";
  return 0;
}
