#include <bits/stdc++.h>
using namespace std;
const int inf = ~0U >> 1;
const long long INF = ~0ULL >> 1;
struct Segment_Tree {
  struct node {
    int l, r, m, lazy;
  } t[200000 * 4];
  void add(int p, int d) {
    t[p].m += d;
    t[p].lazy += d;
  }
  void push(int p) {
    add(p << 1, t[p].lazy);
    add(p << 1 | 1, t[p].lazy);
    t[p].lazy = 0;
  }
  void modify(int p, int l, int r, int d) {
    if (l > r) return;
    if (t[p].l == l && t[p].r == r) {
      add(p, d);
      return;
    }
    push(p);
    int m = t[p].l + t[p].r >> 1;
    if (r <= m)
      modify(p << 1, l, r, d);
    else if (l > m)
      modify(p << 1 | 1, l, r, d);
    else
      modify(p << 1, l, m, d), modify(p << 1 | 1, m + 1, r, d);
    t[p].m = max(t[p << 1].m, t[p << 1 | 1].m);
  }
  int query(int p, int l, int r) {
    if (l > r) return 0;
    if (t[p].l == l && t[p].r == r) return t[p].m;
    push(p);
    int m = t[p].l + t[p].r >> 1;
    if (r <= m)
      return query(p << 1, l, r);
    else if (l > m)
      return query(p << 1 | 1, l, r);
    else
      return max(query(p << 1, l, m), query(p << 1 | 1, m + 1, r));
  }
  void build(int p, int l, int r) {
    t[p].l = l;
    t[p].r = r;
    if (l != r) {
      build(p << 1, l, l + r >> 1);
      build(p << 1 | 1, (l + r >> 1) + 1, r);
    }
    t[p].m = 0;
  }
} T[2];
void error() {
  puts("No solution");
  exit(0);
}
const int maxn = 100000;
int N, M, Time, Index, id[maxn], a[maxn], b[maxn], Ans[maxn], ans[maxn];
bool cmp(const int &A, const int &B) { return b[A] < b[B]; }
int main() {
  T[0].build(1, 0, 86400);
  T[1].build(1, 0, 86400);
  scanf("%d%d%d", &N, &M, &Time);
  for (int i = (1); i <= (N); ++i) {
    int x, y, z;
    scanf("%d:%d:%d", &x, &y, &z);
    a[i] = z + y * 60 + x * 60 * 60;
    T[0].modify(1, a[i], a[i], 1);
  }
  for (int i = (1); i <= (N); ++i) {
    T[0].modify(1, a[i], a[i], -1);
    int t1 = bool(T[0].query(1, a[i], a[i] + Time - 1));
    t1 = 0;
    int t2 = T[1].query(1, a[i], a[i] + Time - 1);
    if (t2 + t1 + 1 <= M) {
      ans[i] = ++Index;
      T[1].modify(1, a[i], a[i] + Time - 1, 1);
    } else {
      if (i == 1) error();
      int last = a[i - 1];
      if (a[i - 1] + Time < a[i]) error();
      t1 = bool(T[0].query(1, last + Time, a[i] + Time - 1));
      t1 = 0;
      t2 = T[1].query(1, last + Time, a[i] + Time - 1);
      if (t1 + t2 + 1 <= M)
        T[1].modify(1, last + Time, a[i] + Time - 1, 1);
      else
        error();
      ans[i] = ans[i - 1];
    }
  }
  if (T[1].query(1, 0, 86400) == M) {
    printf("%d\n", Index);
    for (int i = (1); i <= (N); ++i) printf("%d\n", ans[i]);
  } else
    puts("No solution");
  return 0;
}
