#include <bits/stdc++.h>
using namespace std;
const long long INF = 1 << 28;
const long long LINF = 1ll << 61;
struct SGT {
  struct node {
    int l, r, mn, delta;
  } a[200111];
  void build(int l, int r, int p = 1) {
    a[p].l = l;
    a[p].r = r;
    a[p].mn = a[p].delta = 0;
    if (l == r) return;
    int m = l + r >> 1;
    build(l, m, p << 1);
    build(m + 1, r, p << 1 | 1);
  }
  void push_down(int p) {
    if (a[p].delta != 0) {
      if (a[p].l != a[p].r) {
        a[p << 1].delta += a[p].delta;
        a[p << 1 | 1].delta += a[p].delta;
      }
      a[p].mn += a[p].delta;
      a[p].delta = 0;
    }
  }
  void add(int x, int y, int v, int p = 1) {
    int l = a[p].l, r = a[p].r;
    if (x <= l && r <= y) {
      a[p].delta += v;
      push_down(p);
      return;
    }
    push_down(p);
    if (y < l || r < x) return;
    add(x, y, v, p << 1);
    add(x, y, v, p << 1 | 1);
    a[p].mn = min(a[p << 1].mn, a[p << 1 | 1].mn);
  }
  int query(int x, int y, int p = 1) {
    push_down(p);
    int l = a[p].l, r = a[p].r;
    if (x <= l && r <= y) return a[p].mn;
    int m = l + r >> 1;
    if (x <= m && m < y)
      return min(query(x, y, p << 1), query(x, y, p << 1 | 1));
    else if (x <= m)
      return query(x, y, p << 1);
    else
      return query(x, y, p << 1 | 1);
  }
} sgt;
char s[50111];
int n, a[50111], qn;
pair<int, int> q[50111];
long long ans;
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  sgt.build(1, n);
  for (int i = 1; i <= n; i++) {
    a[i] = a[i - 1];
    if (s[i] == '(') {
      a[i]++;
    } else if (s[i] == ')') {
      a[i]--;
    } else {
      s[i] = '(';
      a[i]++;
      q[++qn].second = i;
    }
    sgt.add(i, i, a[i]);
  }
  for (int i = 1; i <= qn; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    ans += x;
    q[i].first = y - x;
  }
  sort(q + 1, q + qn + 1);
  int tot = a[n] / 2;
  for (int i = n - 1; i >= 1; i--) a[i] = min(a[i], a[i + 1]);
  for (int i = 1; i <= qn && tot > 0; i++) {
    int pos = q[i].second;
    if (sgt.query(pos, n) >= 2) {
      sgt.add(pos, n, -2);
      ans += q[i].first;
      s[pos] = ')';
      tot--;
    }
  }
  bool ok = 1;
  ok &= sgt.query(1, n) >= 0;
  ok &= sgt.query(n, n) == 0;
  if (!ok)
    puts("-1");
  else {
    printf("%I64d\n", ans);
    printf("%s\n", s + 1);
  }
  return 0;
}
