#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10, INF = 1e8 + 10;
int n;
int dp[N][2];
char s[N];
vector<pair<int, int> > v;
int fl[N][2];
void go(int i, int f) {
  if (s[i] == '0') {
    if (f == 0 && fl[i][f] == 1) {
      v.push_back(make_pair(1, i));
    } else if (f && fl[i][f] == 1) {
      v.push_back(make_pair(-1, i));
    }
  } else {
    if (f == 0) {
      v.push_back(make_pair(1, i));
    } else {
      if (fl[i][f] == 0) {
        v.push_back(make_pair(-1, i));
      }
    }
  }
  if (i == n - 1) return;
  go(i + 1, fl[i][f]);
}
void print() {
  for (int i = 0; i < v.size(); ++i) {
    printf("%c2^%d\n", v[i].first > 0 ? '+' : '-', n - 1 - v[i].second);
  }
}
int main() {
  scanf("%s", s);
  n = strlen(s);
  for (int i = 0; i <= n; ++i) {
    dp[i][0] = dp[i][1] = INF;
  }
  if (s[n - 1] == '0') {
    dp[n - 1][0] = 0;
  } else {
    fl[n - 1][0] = 0;
    dp[n - 1][0] = 1;
    fl[n - 1][1] = 0;
    dp[n - 1][1] = 1;
  }
  for (int i = n - 2; i >= 0; --i) {
    if (s[i] == '0') {
      if (dp[i + 1][0] < dp[i + 1][1] + 1) {
        fl[i][0] = 0;
      } else {
        fl[i][0] = 1;
      }
      dp[i][0] = min(dp[i + 1][0], dp[i + 1][1] + 1);
      fl[i][1] = 1;
      dp[i][1] = dp[i + 1][1] + 1;
    } else {
      fl[i][0] = 0;
      dp[i][0] = dp[i + 1][0] + 1;
      if (dp[i + 1][0] + 1 < dp[i + 1][1]) {
        fl[i][1] = 0;
      } else {
        fl[i][1] = 1;
      }
      dp[i][1] = min(dp[i + 1][0] + 1, dp[i + 1][1]);
    }
  }
  if (dp[0][0] < dp[0][1] + 1) {
    printf("%d\n", dp[0][0]);
    go(0, 0);
  } else {
    printf("%d\n", dp[0][1] + 1);
    v.push_back(make_pair(1, -1));
    go(0, 1);
  }
  print();
  return 0;
}
