1. #include <cstdio>
    2. #include <queue>
    3. #include <cstring>
    4. #include <cmath>
    5. #include <iostream>
    6. #include <cstdlib>
    7. #define int long long
    8. using namespace std;
    9. inline int gi(){
    10. char tmp=getchar();int ans=0;
    11. while(!isdigit(tmp)) tmp=getchar();
    12. while(isdigit(tmp)){
    13. ans=ans*10+tmp-'0';
    14. tmp=getchar();
    15. }
    16. return ans;
    17. }
    18. const int N = 1002000;
    19. struct Nod{
    20. int pos,v,v2;
    21. bool operator > (const Nod &x)const{
    22. return v-v2 > x.v-x.v2;
    23. }
    24. };
    25. priority_queue<Nod,vector<Nod>,greater<Nod> > Q;
    26. inline void Push(int p,int v,int v2){
    27. Nod pos;pos.pos=p;pos.v=v;
    28. pos.v2=v2;
    29. Q.push(pos);
    30. }
    31. char S[N];
    32. int A[N],B[N];
    33. char Ans[N];
    34. signed main()
    35. {
    36. #ifdef TSUKIAKIOI
    37. freopen("data.in","r",stdin);
    38. #endif
    39. scanf("%s",S+1);
    40. int len = strlen(S+1);
    41. for(int i=1;i<=len;++i)
    42. if(S[i] == '?')
    43. A[i]=gi(),B[i]=gi();
    44. int tot=0;
    45. int ans=0;
    46. for(int i=1;i<=len;++i){
    47. if(S[i] == '(') Ans[i] = '(',tot++;
    48. if(S[i] == ')') Ans[i] = ')',tot--;
    49. if(S[i] == '?') {Ans[i] = ')';ans += B[i];Push(i,A[i],B[i]);--tot;}
    50. if(tot < 0 && !Q.empty()){
    51. tot+=2;
    52. ans += (Q.top().v-Q.top().v2);
    53. Ans[Q.top().pos] = '(';
    54. Q.pop();
    55. }
    56. if(tot < 0)
    57. return puts("-1"),0;
    58. }
    59. if(tot!=0){
    60. return puts("-1"),0;
    61. }
    62. printf("%lld\n",ans);
    63. printf("%s\n",Ans+1);
    64. return 0;
    65. }