#include <bits/stdc++.h>
using namespace std;
char s[200005];
int la1, la0, n, f[200005], g[200005], v[200005], b[200005], ans = 0;
vector<int> c[200005];
static int cnt = 0;
void add(int f[200005], int x, int det) {
  while (x <= n) f[x] += det, x += (x & (-x));
}
int que(int f[200005], int x) {
  int ret = 0;
  while (x) ret += f[x], x -= (x & (-x));
  return ret;
}
int find(int f[200005], int x) {
  if (que(f, n) == que(f, x)) return n + 1;
  int l = x + 1, r = n;
  int p = que(f, x);
  while (l < r) {
    int mid = (l + r) >> 1;
    if (que(f, mid) - p > 0)
      r = mid;
    else
      l = mid + 1;
  }
  return l;
}
int trans(char p, int i) {
  if (p == '1') return find(g, i);
  return find(f, i);
}
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  la1 = n + 1;
  la0 = n + 1;
  for (int i = 1; i <= n; i++) {
    if (s[i] == '1')
      add(f, i, 1);
    else
      add(g, i, 1);
  }
  for (int i = 1; i <= n; i++) {
    if (v[i]) continue;
    if (s[i] != '0' && !v[i]) {
      printf("-1\n");
      return 0;
    }
    if (s[i] == '1') continue;
    ++cnt;
    v[i] = 1;
    int la = i, j = i;
    for (; j <= n; j = trans(s[j], j)) {
      v[j] = 1, c[cnt].push_back(j);
      if (s[j] == '1')
        add(f, j, -1);
      else
        add(g, j, -1);
      la = j;
    }
    if (s[la] == '1') {
      c[cnt].pop_back();
      add(f, la, 1);
      v[la] = 0;
    }
  }
  for (int i = 1; i <= n; i++) ans += v[i] ? 0 : 1;
  printf("%d\n", cnt + ans);
  for (int i = 1; i <= n; i++)
    if (!v[i] && s[i] == '1') {
      puts("-1");
      return 0;
    }
  for (int i = 1; i <= cnt; i++) {
    printf("%d ", c[i].size());
    for (auto x : c[i]) printf("%d ", ((b[x] = 1), x));
    printf("\n");
  }
  for (int i = 1; i <= n; i++)
    if (!b[i]) printf("%d %d\n", 1, i);
}
