package main
import (
"fmt"
"io"
"os"
"strconv"
"strings"
)
func eval_split(S string, mask int) (int, string) {
sum := 0
expr := ""
current := 0
for i := 0; i < len(S); i++ {
current = current*10 + int(S[i]-'0')
expr += string(S[i])
if i == len(S)-1 || (mask&(1<<i)) != 0 {
sum += current
if i != len(S)-1 {
expr += "+"
}
current = 0
}
}
return sum, expr
}
func is_good(V1 int) (bool, string, string) {
S1 := strconv.Itoa(V1)
n1 := len(S1)
for m1 := 0; m1 < (1<<(n1-1)); m1++ {
V2, expr1 := eval_split(S1, m1)
S2 := strconv.Itoa(V2)
n2 := len(S2)
for m2 := 0; m2 < (1<<(n2-1)); m2++ {
V3, expr2 := eval_split(S2, m2)
if V3 <= 9 {
return true, expr1, expr2
}
}
}
return false, "", ""
}
func build_expr(S string, start int, L int) string {
var sb strings.Builder
for i := 0; i < len(S); i++ {
if start != -1 && i == start {
sb.WriteString(S[i : i+L])
i += L - 1
} else {
sb.WriteByte(S[i])
}
if i != len(S)-1 {
sb.WriteByte('+')
}
}
return sb.String()
}
func build_expr_2(S string, i1, L1, i2, L2 int) string {
var sb strings.Builder
for i := 0; i < len(S); i++ {
if i == i1 {
sb.WriteString(S[i : i+L1])
i += L1 - 1
} else if i == i2 {
sb.WriteString(S[i : i+L2])
i += L2 - 1
} else {
sb.WriteByte(S[i])
}
if i != len(S)-1 {
sb.WriteByte('+')
}
}
return sb.String()
}
func main() {
bytes, err := io.ReadAll(os.Stdin)
if err != nil {
return
}
fields := strings.Fields(string(bytes))
if len(fields) < 2 {
return
}
S := fields[1]
M := 0
for i := 0; i < len(S); i++ {
M += int(S[i] - '0')
}
visited := make(map[int]bool)
visited[M] = true
if ok, expr1, expr2 := is_good(M); ok {
fmt.Println(build_expr(S, -1, 1))
fmt.Println(expr1)
fmt.Println(expr2)
return
}
for L := 2; L <= 7; L++ {
for i := 0; i <= len(S)-L; i++ {
sub_sum := 0
for j := 0; j < L; j++ {
sub_sum += int(S[i+j] - '0')
}
val, _ := strconv.Atoi(S[i : i+L])
V1_new := M - sub_sum + val
if visited[V1_new] {
continue
}
visited[V1_new] = true
if ok, expr1, expr2 := is_good(V1_new); ok {
fmt.Println(build_expr(S, i, L))
fmt.Println(expr1)
fmt.Println(expr2)
return
}
}
}
iters := 0
for i := 0; i <= len(S)-4; i++ {
if S[i] == '0' {
continue
}
for j := i + 2; j <= len(S)-2; j++ {
iters++
if iters > 10000 {
return
}
sub_sum := int(S[i]-'0') + int(S[i+1]-'0') + int(S[j]-'0') + int(S[j+1]-'0')
val1, _ := strconv.Atoi(S[i : i+2])
val2, _ := strconv.Atoi(S[j : j+2])
V1_new := M - sub_sum + val1 + val2
if visited[V1_new] {
continue
}
visited[V1_new] = true
if ok, expr1, expr2 := is_good(V1_new); ok {
fmt.Println(build_expr_2(S, i, 2, j, 2))
fmt.Println(expr1)
fmt.Println(expr2)
return
}
}
}
}