#include <bits/stdc++.h>
using namespace std;
char V[1000010];
int n;
int dp[1000010][2], com[1000010][2];
int pf[1000010];
bool has_zero(int f, int t = -1) {
  if (t == -1) t = n - 1;
  if (f > t) return false;
  int S = pf[t] - ((f == 0) ? 0 : pf[f - 1]);
  return !(S == (t - f + 1));
}
int first_zero(int p) {
  if (!has_zero(p + 1)) return n;
  int lo = p + 1, hi = n - 1, mid;
  for (;;) {
    if (lo + 1 >= hi) {
      if (has_zero(p + 1, lo))
        mid = lo;
      else
        mid = hi;
      break;
    }
    mid = (lo + hi) / 2;
    if (has_zero(p + 1, mid))
      hi = mid;
    else
      lo = mid;
  }
  return mid;
}
inline int get(int p) {
  if (p >= n) return 0;
  return V[p] - '0';
}
int calc_dp(int p, int w) {
  if (p == n) {
    if (w == 0) return 0;
    return 1;
  }
  if (dp[p][w] != -1) return dp[p][w];
  int& D = dp[p][w];
  D = 100000000;
  if (w == 0) {
    if (D > calc_dp(p, 1) + 1) D = calc_dp(p, 1) + 1, com[p][w] = 0;
    if (D > calc_dp(p + 1, get(p + 1)))
      D = calc_dp(p + 1, get(p + 1)), com[p][w] = 1;
  } else {
    if (D > calc_dp(p + 1, get(p + 1)) + 1)
      D = calc_dp(p + 1, get(p + 1)) + 1, com[p][w] = 0;
    int f0 = first_zero(p);
    if (D > calc_dp(f0, 1) + 1) D = calc_dp(f0, 1) + 1, com[p][w] = 1;
  }
  return D;
}
void out(int p, int w) {
  if (p == n) {
    if (w == 1) cout << "+2^" << p << '\n';
    return;
  }
  if (w == 0) {
    if (com[p][w] == 0) {
      cout << "+2^" << p << '\n';
      out(p, 1);
    } else
      out(p + 1, get(p + 1));
  } else {
    if (com[p][w] == 0) {
      cout << "+2^" << p << '\n';
      out(p + 1, get(p + 1));
    } else {
      int f0 = first_zero(p);
      cout << "-2^" << p << '\n';
      out(f0, 1);
    }
  }
}
int main() {
  memset(dp, -1, sizeof dp);
  gets(V);
  n = strlen(V);
  reverse(V, V + n);
  pf[0] = V[0] - '0';
  for (int i = 1; i < n; ++i) pf[i] = pf[i - 1] + V[i] - '0';
  cout << calc_dp(0, get(0)) << '\n';
  out(0, get(0));
  return 0;
}
