```go
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
s, _ := reader.ReadString('\n')
s = strings.TrimSpace(s)
n := len(s)
if n == 0 {
return
}
balances := make([]int, n)
curr := 0
maxBal := 0
for i := 0; i < n; i++ {
balances[i] = curr
if curr > maxBal {
maxBal = curr
}
if s[i] == '(' {
curr++
} else {
curr--
}
}
buckets := make([][]byte, maxBal+1)
for i := n - 1; i >= 0; i-- {
b := balances[i]
buckets[b] = append(buckets[b], s[i])
}
var sb strings.Builder
sb.Grow(n)
for _, bucket := range buckets {
sb.Write(bucket)
}
fmt.Println(sb.String())
}
```