#include <bits/stdc++.h>
using namespace std;
vector<string> split(const string& s, const string& delim = " ") {
  vector<string> res;
  string t;
  for (int i = 0; i != s.size(); i++) {
    if (delim.find(s[i]) != string::npos) {
      if (!t.empty()) {
        res.push_back(t);
        t = "";
      }
    } else {
      t += s[i];
    }
  }
  if (!t.empty()) {
    res.push_back(t);
  }
  return res;
}
vector<int> splitInt(const string& s, const string& delim = " ") {
  vector<string> tok = split(s, delim);
  vector<int> res;
  for (int i = 0; i != tok.size(); i++) res.push_back(atoi(tok[i].c_str()));
  return res;
}
template <typename T>
void print(T a) {
  cerr << a;
}
static void print(long long a) { cerr << a << "L"; }
static void print(string a) { cerr << '"' << a << '"'; }
template <typename T>
void print(vector<T> a) {
  cerr << "{";
  for (int i = 0; i != a.size(); i++) {
    if (i != 0) cerr << ", ";
    print(a[i]);
  }
  cerr << "}" << endl;
}
char flag[1000005];
int main() {
  string s;
  while (cin >> s) {
    memset(flag, 0, sizeof(flag));
    reverse(s.begin(), s.end());
    for (int i = 0, _n = (s.size()); i < _n; i++) flag[i] = s[i] - '0';
    int i = 0, n = s.size();
    while (i < n) {
      int count = 0;
      while (i < n && flag[i + count] == 1) count++;
      if (count > 1) {
        for (int j = (i), _n = (i + count - 1); j <= _n; j++) flag[j] = 0;
        flag[i] = -1;
        flag[i + count] = 1;
        i = i + count - 1;
      }
      i++;
    }
    int count = 0;
    for (int i = 0, _n = (n + 3); i < _n; i++) count += (flag[i] != 0);
    printf("%d\n", count);
    for (int i = (0), _n = (n + 3); i <= _n; i++)
      if (flag[i] != 0) {
        if (flag[i] < 0)
          printf("-");
        else
          printf("+");
        printf("2^%d\n", i);
      }
  }
  return 0;
}
