#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;
}