#include <bits/stdc++.h>
using namespace std;
using namespace std;
const int MaxN = 1000006, NA = -1, MaxC = 0x3F3F3F3F;
enum { PLUS, MINUS, NONE };
char s[MaxN];
int f[MaxN][2];
int p[MaxN][2];
int q[MaxN][2];
int r[MaxN][2];
int n;
inline void relax(int i, int j, int k, int l, int d, int sign, int value) {
  if (f[i][j] > f[k][l] + d) {
    f[i][j] = f[k][l] + d;
    if (sign == PLUS)
      p[i][j] = +value + 1;
    else if (sign == MINUS)
      p[i][j] = -value - 1;
    else
      p[i][j] = 0;
    q[i][j] = k;
    r[i][j] = l;
  }
}
int main(void) {
  int i, j, k, m;
  while (scanf(" %s", s + 1) != EOF) {
    s[0] = '0';
    n = strlen(s);
    memset(f, MaxC, sizeof(f));
    f[0][0] = 0;
    f[0][1] = 1;
    p[0][1] = 1;
    q[0][1] = 0;
    r[0][1] = 0;
    for (i = 1; i < n; i++) {
      if (s[i] == '0') {
        relax(i, 0, i - 1, 0, 0, NONE, MaxC);
        relax(i, 1, i - 1, 0, 1, PLUS, i);
        relax(i, 1, i - 1, 1, 1, MINUS, i);
      } else {
        relax(i, 0, i - 1, 0, 1, PLUS, i);
        relax(i, 1, i - 1, 1, 0, NONE, MaxC);
        relax(i, 0, i - 1, 1, 1, MINUS, i);
      }
    }
    n--;
    m = n;
    k = 0;
    printf("%d\n", f[n][0]);
    while (n || k) {
      i = n;
      j = k;
      assert(f[i][j] != MaxC);
      if (p[i][j] > 0)
        printf("+2^%d\n", m - (p[i][j] - 1));
      else if (p[i][j] < 0)
        printf("-2^%d\n", m - (-p[i][j] - 1));
      else
        ;
      n = q[i][j];
      k = r[i][j];
    }
  }
  return 0;
}
