#include <bits/stdc++.h>
using namespace std;
struct edge {
  int a, b, fff, pos;
} e[100009];
int flag[100009];
bool cmp1(edge e1, edge e2) { return e1.a < e2.a; }
bool cmp2(edge e1, edge e2) { return e1.pos < e2.pos; }
int main() {
  int n;
  while (scanf("%d", &n) != EOF) {
    int i, j, k, l = 1, max = -1;
    for (i = 0; i < n; i++) {
      scanf("%d", &e[i].a);
      if (e[i].a > max) max = e[i].a;
      flag[e[i].a]++;
    }
    for (i = 0; i < n; i++) e[i].fff = 0, e[i].pos = i;
    sort(e, e + n, cmp1);
    int temp = flag[1];
    int ff = 0;
    for (i = 0; i < n; i++) {
      if (e[i].a == 1 && e[i].fff == 0) {
        int t = 1;
        for (j = i; j < n; j++) {
          if (e[j].a == t && e[j].fff == 0) {
            e[j].fff = 1;
            e[j].b = l;
            t++;
          }
        }
        l++;
      } else
        break;
    }
    sort(e, e + n, cmp2);
    for (i = 0; i < n; i++)
      if (e[i].fff == 0) break;
    if (i != n)
      printf("-1\n");
    else {
      printf("%d\n", temp);
      for (i = 0; i < n - 1; i++) printf("%d ", e[i].b);
      printf("%d\n", e[i].b);
    }
  }
  return 0;
}
