#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const long long int inf = 1e9 + 7;
const long long int mod = 1e9 + 7;
map<int, int>::iterator it;
long long int read() {
  long long int x;
  scanf("%lld", &x);
  return x;
}
string c2s(char c) {
  string re = "0";
  re[0] = c;
  return re;
}
long long int printv(vector<long long int> V) {
  cout << V.size() << ": ";
  for (long long int i = 0; i < V.size(); i++) cout << V[i] << " ";
  puts("");
}
long long int gcd(long long int x, long long int y) {
  while (x % y) {
    long long int t = x % y;
    x = y;
    y = t;
  }
  return y;
}
long long int readv(vector<long long int>& V) {
  for (long long int i = 0; i < ((long long int)V.size()); i++) V[i] = read();
}
bool isprime(long long int x) {
  for (long long int i = 2; i * i <= x; i++)
    if (x % i == 0) return false;
  return true;
}
void yn(bool x) {
  if (x)
    puts("YES");
  else
    puts("NO");
}
const long long int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
const long long int dir2[8][2] = {{1, 1},  {1, 0},  {1, -1}, {0, 1},
                                  {0, -1}, {-1, 1}, {-1, 0}, {-1, -1}};
struct Tree {
  long long int n, rt;
  const static long long int N = 1e5 + 5;
  vector<long long int> v[N];
  long long int dp[N], fa[N], d[N];
  void init() {
    (memset(fa, 0, sizeof(fa)));
    (memset(d, 0, sizeof(d)));
    (memset(dp, 0, sizeof(dp)));
    n = rt = 0;
  }
  void getdegree() {
    for (long long int i = 1; i < n + 1; i++)
      for (long long int j = 0; j < ((long long int)v[i].size()); j++) {
        d[i]++;
        d[v[i][j]]++;
      }
    for (long long int i = 1; i < n + 1; i++) d[i] /= 2;
  }
  void getfa_dp() {
    bool vis[N];
    (memset(vis, 0, sizeof(vis)));
    queue<long long int> Q;
    Q.push(rt);
    dp[rt] = 0;
    vis[rt] = 1;
    while (((long long int)Q.size())) {
      long long int x = Q.front();
      Q.pop();
      for (long long int i = 0; i < ((long long int)v[x].size()); i++) {
        long long int y = v[x][i];
        if (vis[y]) continue;
        vis[y] = 1;
        dp[y] = dp[x] + 1;
        fa[y] = x;
        Q.push(y);
      }
    }
  }
  void solve() { init(); }
};
char s[1005];
bool vis[1005], modi[1005];
vector<long long int> v[1005];
int main() {
  scanf("%s", s + 1);
  int n = strlen(s + 1);
  int CNT = 0;
  while (true) {
    bool con = false;
    int l = 1, r = n;
    while (true) {
      while ((vis[l] || s[l] == ')') && l <= n) l++;
      while ((vis[r] || s[r] == '(') && r > 0) r--;
      if (l == n + 1 || r == 0 || l > r) break;
      modi[l++] = modi[r--] = 1;
      con = true;
    }
    if (!con) break;
    CNT++;
    for (int i = 1; i <= n; i++) {
      if (modi[i]) {
        vis[i] = 1;
        v[CNT].push_back(i);
        modi[i] = 0;
      }
    }
  }
  cout << CNT << endl;
  for (long long int i = 1; i < CNT + 1; i++) {
    cout << v[i].size() << endl;
    for (long long int j = 0; j < v[i].size(); j++) cout << v[i][j] << " ";
    puts("");
  }
}
