#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
int n;
string a;
int dp[MAXN];
int lastSeenSave[MAXN];
int one[MAXN], zero[MAXN];
void restore(int index) {
  if (index == -1) return;
  if (a[index] == '0') {
    restore(index - 1);
  } else {
    int value = ((lastSeenSave[index] == -1) ? 0 : dp[lastSeenSave[index]]);
    if (lastSeenSave[index] == -1) {
      value += zero[index] + 2;
      if (a[0] == '0') value--;
    } else {
      value += zero[index] - zero[lastSeenSave[index]] + 2;
    }
    if (value < dp[index - 1] + 1) {
      cout << "+2^" << index + 1 << '\n';
      if (lastSeenSave[index] == -1 && a[0] == '0')
        cout << "-2^1" << '\n';
      else
        cout << "-2^" << lastSeenSave[index] + 1 << '\n';
      for (int i = lastSeenSave[index] + 1; i <= index; i++) {
        if (a[i] == '0' && i != 0) cout << "-2^" << i << '\n';
      }
      restore(lastSeenSave[index]);
    } else {
      cout << "+2^" << index << '\n';
      restore(index - 1);
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int lastSeen = -1;
  cin >> a;
  n = a.size();
  reverse(a.begin(), a.end());
  dp[0] = a[0] - '0';
  if (a[0] == '0')
    zero[0] = 1;
  else
    one[0] = 1;
  for (int i = 1; i < n; i++) {
    one[i] = one[i - 1];
    zero[i] = zero[i - 1];
    if (a[i] == '0')
      zero[i]++;
    else if (a[i] == '1')
      one[i]++;
    if (a[i] == '0') {
      if (a[i - 1] == '0') lastSeen = i;
      dp[i] = dp[i - 1];
    } else {
      dp[i] = dp[i - 1] + 1;
      int value = ((lastSeen == -1) ? 0 : dp[lastSeen]);
      if (lastSeen == -1) {
        value += zero[i] + 2;
        if (a[0] == '0') value--;
      } else {
        value += zero[i] - zero[lastSeen] + 2;
      }
      dp[i] = min(dp[i], value);
      lastSeenSave[i] = lastSeen;
    }
  }
  cout << dp[n - 1] << '\n';
  restore(n - 1);
}
