← Home
package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

type State struct {
	i, j, k, c, ax, ay, az int
}

type Node struct {
	prev       State
	dx, dy, dz int
}

var dist [10][10][10][2][2][2][2]int
var parent [10][10][10][2][2][2][2]Node

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	if !scanner.Scan() {
		return
	}
	line := strings.ReplaceAll(scanner.Text(), " ", "")
	parts := strings.Split(line, "=")
	if len(parts) != 2 {
		return
	}
	cStr := parts[1]
	left := strings.Split(parts[0], "+")
	if len(left) != 2 {
		return
	}
	aStr := left[0]
	bStr := left[1]

	lenA := len(aStr)
	lenB := len(bStr)
	lenC := len(cStr)

	a_rev := reverse(aStr)
	b_rev := reverse(bStr)
	c_rev := reverse(cStr)

	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			for k := 0; k < 10; k++ {
				for c := 0; c < 2; c++ {
					for ax := 0; ax < 2; ax++ {
						for ay := 0; ay < 2; ay++ {
							for az := 0; az < 2; az++ {
								dist[i][j][k][c][ax][ay][az] = 1e9
							}
						}
					}
				}
			}
		}
	}

	var queues [256][]State
	dist[0][0][0][0][1][1][1] = 0
	queues[0] = append(queues[0], State{0, 0, 0, 0, 1, 1, 1})

	for d := 0; d < 256; d++ {
		for len(queues[d]) > 0 {
			u := queues[d][0]
			queues[d] = queues[d][1:]

			if dist[u.i][u.j][u.k][u.c][u.ax][u.ay][u.az] < d {
				continue
			}

			if u.ax == 0 && u.ay == 0 && u.az == 0 && u.c == 0 && u.i == lenA && u.j == lenB && u.k == lenC {
				var x_ans, y_ans, z_ans []int
				curr := u
				start := State{0, 0, 0, 0, 1, 1, 1}
				for curr != start {
					p := parent[curr.i][curr.j][curr.k][curr.c][curr.ax][curr.ay][curr.az]
					prev := p.prev
					if prev.ax == 1 {
						x_ans = append(x_ans, p.dx)
					}
					if prev.ay == 1 {
						y_ans = append(y_ans, p.dy)
					}
					if prev.az == 1 {
						z_ans = append(z_ans, p.dz)
					}
					curr = prev
				}

				for _, v := range x_ans {
					fmt.Print(v)
				}
				fmt.Print("+")
				for _, v := range y_ans {
					fmt.Print(v)
				}
				fmt.Print("=")
				for _, v := range z_ans {
					fmt.Print(v)
				}
				fmt.Println()
				return
			}

			if u.ax == 0 && u.ay == 0 && u.az == 0 {
				continue
			}

			cost := u.ax + u.ay + u.az

			for dx := 0; dx <= 9; dx++ {
				if u.ax == 0 && dx != 0 {
					continue
				}
				next_i := u.i
				if u.ax == 1 && u.i < lenA && dx == int(a_rev[u.i]-'0') {
					next_i++
				}

				var n_ax_list []int
				if u.ax == 0 {
					n_ax_list = []int{0}
				} else {
					n_ax_list = []int{1}
					if dx > 0 {
						n_ax_list = append(n_ax_list, 0)
					}
				}

				for dy := 0; dy <= 9; dy++ {
					if u.ay == 0 && dy != 0 {
						continue
					}
					next_j := u.j
					if u.ay == 1 && u.j < lenB && dy == int(b_rev[u.j]-'0') {
						next_j++
					}

					var n_ay_list []int
					if u.ay == 0 {
						n_ay_list = []int{0}
					} else {
						n_ay_list = []int{1}
						if dy > 0 {
							n_ay_list = append(n_ay_list, 0)
						}
					}

					dz := (dx + dy + u.c) % 10
					next_c := (dx + dy + u.c) / 10

					if u.az == 0 && dz != 0 {
						continue
					}
					next_k := u.k
					if u.az == 1 && u.k < lenC && dz == int(c_rev[u.k]-'0') {
						next_k++
					}

					var n_az_list []int
					if u.az == 0 {
						n_az_list = []int{0}
					} else {
						n_az_list = []int{1}
						if dz > 0 {
							n_az_list = append(n_az_list, 0)
						}
					}

					for _, n_ax := range n_ax_list {
						for _, n_ay := range n_ay_list {
							for _, n_az := range n_az_list {
								if n_ax == 0 && n_ay == 0 && n_az == 0 && next_c > 0 {
									continue
								}

								v := State{next_i, next_j, next_k, next_c, n_ax, n_ay, n_az}
								if dist[v.i][v.j][v.k][v.c][v.ax][v.ay][v.az] > d+cost {
									dist[v.i][v.j][v.k][v.c][v.ax][v.ay][v.az] = d + cost
									parent[v.i][v.j][v.k][v.c][v.ax][v.ay][v.az] = Node{u, dx, dy, dz}
									queues[d+cost] = append(queues[d+cost], v)
								}
							}
						}
					}
				}
			}
		}
	}
}

func reverse(s string) string {
	r := []rune(s)
	for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
		r[i], r[j] = r[j], r[i]
	}
	return string(r)
}