#include <bits/stdc++.h>
using namespace std;
using uint = unsigned;
using lint = long long;
using ulint = unsigned long long;
using ldouble = long double;
using point = complex<double>;
using doublex = complex<ldouble>;
const double E = 1e-9, pi = 2 * acos(0);
const ldouble PI = 2 * acosl(0);
string A, B, C;
int na, nb, nc, nbc, nabc, n, nnabc;
vector<int> memo, digs, nex;
int pack(int a, int b, int c) { return 100 * a + 10 * b + c; }
int pack(int mask, int pos, int posA, int posB, int posC) {
  return mask * n * nabc + pos * nabc + posA * nbc + posB * nc + posC;
}
void unpack(int d, int &a, int &b, int &c) {
  tie(a, b, c) = make_tuple(d / 100, d % 100 / 10, d % 10);
}
void unpack(int state, int &mask, int &pos, int &posA, int &posB, int &posC) {
  tie(mask, pos, posA, posB, posC) =
      make_tuple(state / nnabc, state % nnabc / nabc, state % nabc / nbc,
                 state % nbc / nc, state % nc);
}
int dp(int state) {
  int &res = memo[state];
  if (res != -1) return res;
  res = INT_MAX / 2;
  int mask, pos, posA, posB, posC;
  unpack(state, mask, pos, posA, posB, posC);
  if (!pos) {
    if (mask == 7 and posA == na - 1 and posB == nb - 1 and posC == nc - 1)
      res = 0;
    return res;
  }
  for (int i = 0; i < 10; i++)
    for (int j = 0; j < 10; j++) {
      auto update = [&](bool carry) {
        int k = i + j - (mask & 8) / 8 * 10 + carry;
        if (k < 0 or k >= 10) return;
        int nmask = mask & 7;
        if (carry) nmask |= 8;
        if (i) nmask |= 4;
        if (j) nmask |= 2;
        if (k) nmask |= 1;
        int a = (nmask & 4) ? 1 : 0, b = (nmask & 2) ? 1 : 0,
            c = (nmask & 1) ? 1 : 0;
        int npos = pos - 1;
        int nposA = posA, nposB = posB, nposC = posC;
        if (posA < na - 1 and i == A[posA] - '0') nposA++, a--;
        if (posB < nb - 1 and j == B[posB] - '0') nposB++, b--;
        if (posC < nc - 1 and k == C[posC] - '0') nposC++, c--;
        int nstate = pack(nmask, npos, nposA, nposB, nposC),
            nres = a + b + c + dp(nstate);
        if (nres < res) {
          res = nres;
          nex[state] = nstate;
          digs[state] = pack(i, j, k);
        }
      };
      update(false);
      update(true);
    }
  return res;
}
void get(int state) {
  assert((nex[state] == -1) == (digs[state] == -1));
  if (nex[state] == -1) return;
  int a, b, c;
  unpack(digs[state], a, b, c);
  A += a + '0';
  B += b + '0';
  C += c + '0';
  get(nex[state]);
}
bool solve(int testNumber) {
  string str;
  if (!(cin >> str)) return false;
  int p0 = str.find('+'), p1 = str.find('=');
  A = str.substr(0, p0);
  B = str.substr(p0 + 1, p1 - p0 - 1);
  C = str.substr(p1 + 1);
  na = (int)A.size() + 1;
  nb = (int)B.size() + 1;
  nc = (int)C.size() + 1;
  n = na + nb + nc - 2;
  nbc = nb * nc;
  nabc = na * nbc;
  nnabc = n * nabc;
  memo.assign(nnabc << 4, -1);
  digs = nex = memo;
  int start = pack(0, n - 1, 0, 0, 0);
  dp(start);
  A = B = C = "";
  get(start);
  reverse(A.begin(), A.end());
  reverse(B.begin(), B.end());
  reverse(C.begin(), C.end());
  while (A.back() == '0') A.pop_back();
  while (B.back() == '0') B.pop_back();
  while (C.back() == '0') C.pop_back();
  reverse(A.begin(), A.end());
  reverse(B.begin(), B.end());
  reverse(C.begin(), C.end());
  printf("%s+%s=%s\n", A.c_str(), B.c_str(), C.c_str());
  return true;
}
void init() {}
int main() {
  init();
  for (int i = 1; solve(i); i++)
    ;
  return 0;
}
