#include <cstdio>#include <queue>#include <cstring>#include <cmath>#include <iostream>#include <cstdlib>#define int long long using namespace std;inline int gi(){ char tmp=getchar();int ans=0; while(!isdigit(tmp)) tmp=getchar(); while(isdigit(tmp)){ ans=ans*10+tmp-'0'; tmp=getchar(); } return ans;}const int N = 1002000;struct Nod{ int pos,v,v2; bool operator > (const Nod &x)const{ return v-v2 > x.v-x.v2; }};priority_queue<Nod,vector<Nod>,greater<Nod> > Q;inline void Push(int p,int v,int v2){ Nod pos;pos.pos=p;pos.v=v; pos.v2=v2; Q.push(pos);}char S[N];int A[N],B[N];char Ans[N];signed main(){#ifdef TSUKIAKIOI freopen("data.in","r",stdin);#endif scanf("%s",S+1); int len = strlen(S+1); for(int i=1;i<=len;++i) if(S[i] == '?') A[i]=gi(),B[i]=gi(); int tot=0; int ans=0; for(int i=1;i<=len;++i){ if(S[i] == '(') Ans[i] = '(',tot++; if(S[i] == ')') Ans[i] = ')',tot--; if(S[i] == '?') {Ans[i] = ')';ans += B[i];Push(i,A[i],B[i]);--tot;} if(tot < 0 && !Q.empty()){ tot+=2; ans += (Q.top().v-Q.top().v2); Ans[Q.top().pos] = '('; Q.pop(); } if(tot < 0) return puts("-1"),0; } if(tot!=0){ return puts("-1"),0; } printf("%lld\n",ans); printf("%s\n",Ans+1); return 0;}