#include <bits/stdc++.h>
using namespace std;
const int BIG = 1000200;
char buf[BIG];
int skip0[BIG], skip1[BIG];
int vpre[BIG];
struct E {
  int to;
  char sign;
  int pw;
};
vector<E> vg[BIG];
int main() {
  while (scanf(" %s", buf) != EOF) {
    string s(buf);
    s = "00" + s;
    int N = (int)((s).size());
    int prev0 = 0, prev1 = 0;
    memset((skip0), (-1), sizeof(skip0));
    memset((skip1), (-1), sizeof(skip1));
    for (int i = 0; i < (int)(N); ++i) {
      skip0[i] = prev0;
      skip1[i] = prev1;
      if (s[i] == '0') {
        prev0 = i;
      }
      if (s[i] == '1') {
        prev1 = i;
      }
    }
    for (int i = 0; i < (int)(BIG); ++i) vg[i].clear();
    for (int i = 0; i < (int)(N); ++i) {
      if (i == 0) continue;
      vg[i].push_back((E){skip1[i], '+', N - 1 - i});
      vg[i].push_back((E){skip0[i], '-', N - 1 - i});
    }
    int start = -1;
    for (int i = 0; i < (int)(N); ++i)
      if (s[N - 1 - i] == '1') {
        start = N - 1 - i;
        break;
      }
    assert(start >= 0);
    queue<pair<int, int> > q;
    memset((vpre), (-1), sizeof(vpre));
    q.push(make_pair(start, -2));
    while (!q.empty()) {
      int curr = q.front().first;
      int prev = q.front().second;
      q.pop();
      if (vpre[curr] != -1) continue;
      vpre[curr] = prev;
      if (curr == 0) break;
      for (__typeof((vg[curr]).begin()) e = (vg[curr]).begin();
           e != (vg[curr]).end(); ++e) {
        q.push(make_pair(e->to, curr));
      }
    }
    assert(vpre[0] >= 0);
    vector<E> outp;
    for (int curr = 0; curr >= 0; curr = vpre[curr]) {
      int prev = vpre[curr];
      for (__typeof((vg[prev]).begin()) e = (vg[prev]).begin();
           e != (vg[prev]).end(); ++e) {
        if (e->to == curr) {
          outp.push_back(*e);
          break;
        }
      }
    }
    printf("%d\n", (int)((outp).size()));
    for (int i = 0; i < (int)((int)((outp).size())); ++i)
      printf("%c2^%d\n", outp[i].sign, outp[i].pw);
  }
}
