#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 100;
bool used[N];
int nxt[N];
void dfs(int v, vector<int> &a) {
  used[v] = 1;
  a.push_back(v);
  if (nxt[v]) dfs(nxt[v], a);
}
int main() {
  string s;
  cin >> s;
  vector<int> l[2], r;
  for (int i = s.length() - 1; i >= 0; i--) {
    if (s[i] == '0') r.push_back(i);
  }
  for (int i = 0; i < s.length(); i++) {
    if (s[i] == '0') {
      if (r.size() > 0 && r.back() == i) r.pop_back();
      l[used[i]].push_back(i);
    } else {
      for (int j = 0; j < 2; j++) {
        if (!l[j].size() || !r.size()) {
          continue;
        }
        nxt[l[j].back()] = i;
        nxt[i] = r.back();
        used[r.back()] = 1;
        l[j].pop_back();
        r.pop_back();
        break;
      }
      if (!nxt[i]) {
        cout << -1;
        return 0;
      }
    }
  }
  memset(used, 0, sizeof(used));
  vector<vector<int> > ans;
  for (int i = 0; i < s.length(); i++) {
    if (!used[i]) {
      vector<int> a;
      dfs(i, a);
      ans.push_back(a);
    }
  }
  cout << ans.size() << '\n';
  for (int i = 0; i < ans.size(); i++) {
    cout << ans[i].size() << ' ';
    for (int j = 0; j < ans[i].size(); j++) {
      cout << ans[i][j] + 1 << ' ';
    }
    cout << '\n';
  }
  return 0;
}
