#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct edge {
  int u, v;
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int a, b, m;
  cin >> a >> b >> m;
  vector<edge> edges(m);
  vector<int> deg(a + b + 1);
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    edges[i] = {x, y + a};
    deg[x]++;
    deg[y + a]++;
  }
  vector<int> color(m);
  vector<vector<int>> adj(a + b + 1, vector<int>(a + b + 1, -1));
  function<void(int, int, int)> dfs = [&](int i, int cL, int cR) {
    for (int node : {edges[i].u, edges[i].v}) {
      if (int j = adj[node][cL]; j != -1) {
        adj[edges[j].u][cL] = adj[edges[j].v][cL] = -1;
        dfs(j, cR, cL);
      }
    }
    color[i] = cL;
    adj[edges[i].u][cL] = adj[edges[i].v][cL] = i;
  };
  vector<int> available(*max_element(deg.begin(), deg.end()));
  iota(available.begin(), available.end(), 1);
  for (int i = 0; i < m; i++) {
    auto common = find_if(available.begin(), available.end(), [&](int c) {
      return adj[edges[i].u][c] == -1 and adj[edges[i].v][c] == -1;
    });
    if (common != available.end()) {
      dfs(i, *common, *common);
    } else {
      auto cL = find_if(available.begin(), available.end(),
                        [&](int c) { return adj[edges[i].u][c] == -1; });
      auto cR = find_if(available.begin(), available.end(),
                        [&](int c) { return adj[edges[i].v][c] == -1; });
      dfs(i, *cL, *cR);
    }
  }
  cout << set<int>(color.begin(), color.end()).size() << endl;
  for (int c : color) {
    cout << c << " ";
  }
  cout << endl;
  return 0;
}
