#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC optimize(3)
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC target("sse3", "sse2", "sse")
#pragma GCC target("avx", "sse4", "sse4.1", "sse4.2", "ssse3")
#pragma GCC target("f16c")
#pragma GCC optimize("inline", "fast-math", "unroll-loops", \
                     "no-stack-protector")
using namespace std;
const int block_size = 320;
const long long mod = 1e9 + 7;
const long long inf = 1e9 + 7;
const long double eps = 1e-9;
const double PI = atan(1) * 4;
template <typename T>
inline int sign(const T& a) {
  if (a < 0) return -1;
  if (a > 0) return 1;
  return 0;
}
template <typename T, typename S>
inline bool upmin(T& a, const S& b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T, typename S>
inline bool upmax(T& a, const S& b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
inline void in(T& x) {
  x = 0;
  T f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  x *= f;
}
long long twop(int x) { return 1LL << x; }
template <typename A, typename B>
inline void in(A& x, B& y) {
  in(x);
  in(y);
}
template <typename A, typename B, typename C>
inline void in(A& x, B& y, C& z) {
  in(x);
  in(y);
  in(z);
}
template <typename A, typename B, typename C, typename D>
inline void in(A& x, B& y, C& z, D& d) {
  in(x);
  in(y);
  in(z);
  in(d);
}
namespace SOLVE {
void main() {}
}  // namespace SOLVE
string s;
vector<pair<int, int> > candidate;
bool noLeadZero(int start, int end) {
  int cnt = 0;
  for (long long i = start; i < end; i++) {
    if (s[i] == 0 && cnt <= 2)
      cnt++;
    else
      break;
  }
  return cnt == 0 || end - start == 1;
}
void checkValid() {
  vector<pair<int, int> > tmp;
  for (auto sol : candidate) {
    if (noLeadZero(0, sol.first) && noLeadZero(sol.first, sol.second) &&
        noLeadZero(sol.second, ((int)s.size()))) {
      tmp.push_back(sol);
    }
  }
  candidate = tmp;
}
template <typename T>
static T MOD(T a, T m) {
  a %= m;
  if (a < 0) a += m;
  return a;
}
template <typename T>
static T inverse(T a, T m) {
  a = MOD(a, m);
  if (a <= 1) return a;
  return MOD((1 - inverse(m, a) * m) / a, m);
}
long long inv[1000100], pw[1000010], suf[1000010];
void preProcess(const long long& mod) {
  inv[0] = 1;
  inv[1] = inverse(10ll, mod);
  for (long long i = 2; i < ((int)s.size()) + 5; i++) {
    inv[i] = inv[i - 1] * inv[1] % mod;
  }
  pw[0] = 1;
  for (long long i = 1; i < ((int)s.size()) + 5; i++)
    pw[i] = pw[i - 1] * 10 % mod;
  for (long long i = ((int)s.size()) - 1; i >= 0; i--) {
    suf[i] = suf[i + 1] + s[i] * pw[((int)s.size()) - 1 - i];
    suf[i] %= mod;
  }
}
long long getIntervalSum(const int start, const int end, const long long& mod) {
  return ((suf[start] - suf[end] + mod) % mod * inv[((int)s.size()) - end]) %
         mod;
}
void checkSum(const long long& mod) {
  preProcess(mod);
  vector<pair<int, int> > tmp;
  for (auto sol : candidate) {
    if ((getIntervalSum(0, sol.first, mod) +
         getIntervalSum(sol.first, sol.second, mod)) %
            mod ==
        getIntervalSum(sol.second, ((int)s.size()), mod)) {
      tmp.push_back(sol);
    }
  }
  candidate = tmp;
}
bool isPrime(long long p) {
  if (p < 2) return false;
  for (long long i = 2; i < p; i++) {
    if (i * i > p) break;
    if (p % i == 0) return false;
  }
  return true;
}
void bf(pair<int, int> sol) {}
int main() {
  const int bound = 1;
  cin >> s;
  for (auto& i : s) i -= '0';
  for (long long i = 2; i < ((int)s.size()); i++) {
    long long len[] = {i, ((int)s.size()) - i};
    if (len[1] > len[0]) continue;
    if (s[i] == 0 && i != ((int)s.size()) - 1 && s[i + 1] == 0) continue;
    for (long long len0 = len[1] - bound; len0 < len[1] + bound; len0++) {
      if (len0 < i && len0 > 0) candidate.push_back(make_pair(len0, i));
    }
    for (long long len0 = len[1] - bound; len0 < len[1] + bound; len0++) {
      int start = i - len0;
      if (start < i && start > 0) candidate.push_back(make_pair(start, i));
    }
  }
  sort(candidate.begin(), candidate.end());
  candidate.erase(unique(candidate.begin(), candidate.end()), candidate.end());
  checkValid();
  int cnt = 0;
  for (long long i = 132131032; i < 1e9; i++) {
    if (((int)candidate.size()) <= 1) break;
    if (isPrime(i)) {
      cnt++;
      checkSum(i);
    }
  }
  cerr << "cnt"
       << " = " << (cnt) << endl;
  ;
  auto sol = candidate[0];
  for (long long i = 0; i < sol.first; i++) putchar(s[i] + '0');
  putchar('+');
  for (long long i = sol.first; i < sol.second; i++) putchar(s[i] + '0');
  putchar('=');
  for (long long i = sol.second; i < ((int)s.size()); i++) putchar(s[i] + '0');
  return 0;
}
