#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
char s[N], x[N];
int f[N], g[N], n;
void truy(int *f, int *g, char *s, char *x, int i, bool neg) {
  if (i > n) return;
  if (s[i]) {
    truy(f, g, s, x, i + 1, neg);
    printf("%c2^%d\n", (neg ? '-' : '+'), n - i);
  } else if (f[i + 1] < g[i + 1] + 1) {
    truy(f, g, s, x, i + 1, neg);
  } else {
    truy(g, f, x, s, i + 1, !neg);
    printf("%c2^%d\n", (neg ? '-' : '+'), n - i);
  }
}
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  int nho = 0;
  for (int i = n; i >= 1; i--) {
    s[i] -= '0';
    int t = 0, nho2 = 0;
    if (nho) {
      t = 1;
      nho2 = 1;
    }
    if (t < s[i]) {
      nho = 1;
      x[i] = 1;
    } else {
      x[i] = t - s[i];
      nho = 0;
    }
    if (nho2) nho = 1;
  }
  f[n + 1] = g[n + 1] = 0;
  for (int i = n; i > 0; i--) {
    f[i] = g[i] = n + 2;
    if (s[i]) {
      f[i] = f[i + 1] + 1;
    } else {
      f[i] = min(f[i + 1], g[i + 1] + 1);
    }
    if (x[i]) {
      g[i] = g[i + 1] + 1;
    } else {
      g[i] = min(g[i + 1], f[i + 1] + 1);
    }
  }
  printf("%d\n", min(f[1], g[1] + 1));
  if (f[1] < g[1] + 1) {
    truy(f, g, s, x, 1, false);
  } else {
    printf("+2^%d\n", n);
    truy(g, f, x, s, 1, true);
  }
}
