#include <bits/stdc++.h>
using namespace std;
template <typename T>
ostream& operator<<(ostream& o, const vector<T>& v) {
  o << "[";
  for (int64_t i = 0; i < v.size(); i++) {
    o << v[i];
    if (i != v.size() - 1) {
      o << ", ";
    }
  }
  o << "]";
  return o;
}
int main() {
  string s;
  cin >> s;
  vector<bool> v(s.size());
  for (int64_t i = 0; i < s.size(); i++) {
    v[i] = (s[i] == '(');
  }
  vector<vector<int64_t>> sol;
  const int64_t NONE = INT_MIN;
  while (true) {
    unordered_set<int64_t> to_remove;
    int64_t pbegin = NONE;
    int64_t pend = NONE;
    for (int64_t i = 0; i < v.size(); i++) {
      if (v[i]) {
        pbegin = i;
        break;
      }
    }
    if (pbegin == NONE) {
      break;
    }
    for (int64_t i = v.size() - 1; i > pbegin; i--) {
      if (!v[i]) {
        pend = i;
        break;
      }
    }
    if (pend == NONE) {
      break;
    }
    to_remove.insert(pbegin);
    to_remove.insert(pend);
    while (pbegin < pend) {
      pbegin++;
      for (; pbegin < pend; pbegin++) {
        if (v[pbegin]) {
          break;
        }
      }
      pend--;
      for (; pbegin < pend; pend--) {
        if (!v[pend]) {
          break;
        }
      }
      if (pbegin < pend) {
        to_remove.insert(pbegin);
        to_remove.insert(pend);
      } else {
        break;
      }
    }
    sol.push_back(vector<int64_t>());
    for (int64_t e : to_remove) {
      sol.back().push_back(e);
    }
    vector<bool> newv;
    for (int64_t i = 0; i < v.size(); i++) {
      if (!to_remove.count(i)) {
        newv.push_back(v[i]);
      }
    }
    v = newv;
    if (to_remove.size() == 0) {
      break;
    }
  }
  cout << sol.size() << endl;
  for (int64_t i = 0; i < sol.size(); i++) {
    cout << sol[i].size() << endl;
    sort(sol[i].begin(), sol[i].end());
    for (int64_t j = 0; j < sol[i].size(); j++) {
      cout << sol[i][j] + 1 << " ";
    }
    cout << endl;
  }
  return EXIT_SUCCESS;
}
