#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e3 + 100;
char s[N];
int ans[N], cnt;
struct Pair {
  int cnt;
  long long sum;
  Pair(int cnt, long long sum) : cnt(cnt), sum(sum) {}
  Pair operator+(const Pair& a) { return Pair(cnt + a.cnt, sum + a.sum); }
};
struct Point {
  int pos, speed;
  bool operator<(const Point& a) const { return pos < a.pos; }
} a[N];
struct Node {
  int l, r, cnt;
  long long sum;
} tree[N << 2];
void pushup(int k) {
  tree[k].cnt = tree[k << 1].cnt + tree[k << 1 | 1].cnt;
  tree[k].sum = tree[k << 1].sum + tree[k << 1 | 1].sum;
}
void build(int k, int l, int r) {
  tree[k].l = l;
  tree[k].r = r;
  tree[k].cnt = tree[k].sum = 0;
  if (l == r) return;
  int mid = l + r >> 1;
  build(k << 1, l, mid);
  build(k << 1 | 1, mid + 1, r);
}
void update(int k, int pos, int val) {
  if (tree[k].l == tree[k].r) {
    tree[k].cnt++;
    tree[k].sum += val;
    return;
  }
  int mid = tree[k].l + tree[k].r >> 1;
  if (mid >= pos)
    update(k << 1, pos, val);
  else
    update(k << 1 | 1, pos, val);
  pushup(k);
}
Pair query(int k, int l, int r) {
  if (tree[k].l > r || tree[k].r < l) return Pair(0, 0LL);
  if (tree[k].l >= l && tree[k].r <= r) return Pair(tree[k].cnt, tree[k].sum);
  return query(k << 1, l, r) + query(k << 1 | 1, l, r);
}
bool check() {
  int cnt = 0;
  int len = strlen(s);
  for (int i = 0; i < len; i++) {
    if (s[i] == '(')
      cnt++;
    else if (s[i] == ')' && cnt)
      return true;
  }
  return false;
}
int main() {
  build(1, 1, N);
  scanf("%s", s);
  int len = strlen(s);
  if (!check())
    puts("0");
  else {
    puts("1");
    int l = 0, r = len - 1;
    while (l < r) {
      while (l < len && s[l] != '(') l++;
      while (r >= 0 && s[r] != ')') r--;
      if (l < r) {
        ans[cnt++] = l + 1;
        ans[cnt++] = r + 1;
        l++, r--;
      }
    }
    sort(ans, ans + cnt);
    printf("%d\n", cnt);
    for (int i = 0; i < cnt; i++) printf("%d ", ans[i]);
    printf("\n");
  }
  return 0;
}
