#include <bits/stdc++.h>
using namespace std;
const int INF = INT_MAX;
const double EPS = 1e-10;
inline double SQR(double x) { return x * x; }
inline long long SQR(long long x) { return x * x; }
inline int SQR(int x) { return x * x; }
inline double SQR3(double x) { return x * x * x; }
inline void DEBUG() { puts("jackie"); }
inline bool zero(double x) { return abs(x) < EPS; }
inline int inInt() {
  int x = 0, c;
  while ((unsigned int)((c = getchar()) - '0') >= 10) {
    if ('-' == c) return -inInt();
  }
  do {
    x = (x << 3) + (x << 1) + (c - '0');
  } while ((unsigned int)((c = getchar()) - '0') < 10);
  return x;
}
inline void outInt(int x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  if (x >= 10) outInt(x / 10);
  putchar((x % 10) + '0');
}
const int MAXN = 1100000;
char a[MAXN], b[MAXN];
int len;
int dpa[MAXN], dpb[MAXN];
int DPb(int s);
int DPa(int s) {
  if (-1 != dpa[s]) {
    return dpa[s];
  }
  if (s == len) return 0;
  int ans = 0;
  switch (a[s]) {
    case 0: {
      ans = min(DPa(s + 1), 1 + DPb(s + 1));
      break;
    }
    case 1: {
      ans = DPa(s + 1) + 1;
      break;
    }
  }
  dpa[s] = ans;
  return ans;
}
int DPb(int s) {
  if (-1 != dpb[s]) return dpb[s];
  if (s == len) return 0;
  int ans;
  switch (b[s]) {
    case 0: {
      ans = min(DPa(s + 1) + 1, DPb(s + 1));
      break;
    }
    case 1: {
      ans = DPb(s + 1) + 1;
      break;
    }
  }
  dpb[s] = ans;
  return dpb[s];
}
int main() {
  a[0] = '0';
  gets(a + 1);
  len = strlen(a);
  for (int i = 0; i < len; i++) a[i] -= '0';
  for (int i = 0; i < len; i++) b[i] = 1 - a[i];
  b[len - 1]++;
  int x = len - 1;
  while (b[x] > 1) {
    b[x] = 0;
    b[x - 1]++;
    x--;
  }
  memset(dpa, -1, sizeof(dpa));
  memset(dpb, -1, sizeof(dpb));
  int ans = DPa(0);
  printf("%d\n", ans);
  int s = 0;
  int flag = 0;
  while (s < len) {
    switch (flag) {
      case 0: {
        switch (a[s]) {
          case 0: {
            if (DPa(s + 1) != DPa(s)) {
              flag = 1 - flag;
              printf("+2^%d\n", len - s - 1);
            }
            break;
          }
          case 1: {
            printf("+2^%d\n", len - s - 1);
            break;
          }
        }
        break;
      }
      case 1: {
        switch (b[s]) {
          case 0: {
            if (DPb(s + 1) != DPb(s)) {
              flag = 1 - flag;
              printf("-2^%d\n", len - 1 - s);
            }
            break;
          }
          case 1: {
            printf("-2^%d\n", len - 1 - s);
            break;
          }
        }
        break;
      }
    }
    s++;
  }
  return 0;
}
