#include <bits/stdc++.h>
static const int INF = std::numeric_limits<int>::max();
struct Node {
  char c;
  int cnt;
  int l, r, run;
  Node(char c, int cnt, int l) : c(c), cnt(cnt), l(l), r(-1), run(0) {}
};
int main() {
  std::string s;
  std::cin >> s;
  std::stack<Node> st;
  int best = 0;
  int bestr, bestl;
  bestr = bestl = 0;
  st.push(Node('*', 0, -1));
  for (int i = 0; i < (int)s.size(); ++i) {
    char c = s[i];
    if (c == '[' || c == '(') {
      st.push(Node(c, c == '[' ? 1 : 0, i));
    } else {
      if ((st.top().c == '[' && c == ']') || (st.top().c == '(' && c == ')')) {
        int x = st.top().cnt;
        st.pop();
        int y = x + st.top().run;
        if (best < y) {
          best = y;
          bestl = st.top().l + 1;
          bestr = i + 1;
        }
        st.top().cnt += x;
        st.top().run += x;
        st.top().r = i + 1;
      } else {
        std::stack<Node> st2;
        std::swap(st, st2);
        st.push(Node('*', 0, i));
      }
    }
  }
  std::cout << best << std::endl << s.substr(bestl, bestr - bestl) << std::endl;
}
