#include <bits/stdc++.h>
using namespace std;
struct P {
  int a[4];
  int& operator[](int i) { return a[i]; }
  void Scan() {
    for (int i = 0; i < (int)(4); i++) scanf("%d", &a[i]);
  }
  P Plus(int p) {
    int p1 = p;
    int p2 = (p + 1) % 4;
    P res = *this;
    res[p1]++;
    res[p2]++;
    return res;
  }
  P Minus(int p) {
    int p1 = p;
    int p2 = (p + 1) % 4;
    P res = *this;
    res[p1]--;
    res[p2]--;
    return res;
  }
  P Div(int p) {
    int p1 = p;
    int p2 = (p + 1) % 4;
    P res = *this;
    if ((res[p1] % 2 == 0) && (res[p2] % 2 == 0)) {
      res[p1] /= 2;
      res[p2] /= 2;
    }
    return res;
  }
  P Mul(int p) {
    int p1 = p;
    int p2 = (p + 1) % 4;
    P res = *this;
    res[p1] *= 2;
    res[p2] *= 2;
    return res;
  }
};
bool operator<(P x, P y) {
  for (int i = 0; i < (int)(4); i++)
    if (x[i] != y[i]) return x[i] < y[i];
  return false;
}
bool operator>(P x, P y) { return y < x; }
bool operator==(P x, P y) { return !(x < y) && !(y < x); }
P ONE;
queue<P> q;
map<P, int> d;
map<P, int> w;
vector<string> BFS(P p) {
  q.push(p);
  d[p] = 1;
  w[p] = -1;
  while (!q.empty()) {
    p = q.front();
    q.pop();
    if (p == ONE) break;
    int pd = d[p];
    for (int i = 0; i < (int)(4); i++) {
      P t = p.Plus(i);
      for (int j = 0; j < (int)(4); j++)
        if (t[i] > 50) continue;
      int& td = d[t];
      if (td == 0) {
        td = pd + 1;
        w[t] = 10 + i;
        q.push(t);
      }
      if (t == ONE) goto finish;
    }
    for (int i = 0; i < (int)(4); i++) {
      P t = p.Div(i);
      int& td = d[t];
      if (td == 0) {
        td = pd + 1;
        w[t] = 20 + i;
        q.push(t);
      }
      if (t == ONE) goto finish;
    }
  }
finish:
  if (d[ONE] == 0)
    return (vector<string>(1, "-1"));
  else {
    vector<string> res;
    p = ONE;
    while (1) {
      int ww = w[p];
      if (ww == -1) break;
      if (ww < 20) {
        ww -= 10;
        p = p.Minus(ww);
        res.push_back(string("+") + (char)('1' + ww));
      } else {
        ww -= 20;
        p = p.Mul(ww);
        res.push_back(string("/") + (char)('1' + ww));
      }
    }
    reverse((res).begin(), (res).end());
    return res;
  }
}
vector<string> PRE(P& p) {
  vector<string> res;
  int ss = 0;
  while (1) {
    bool ok = true;
    for (int i = 0; i < (int)(4); i++)
      if (p[i] > 20) ok = false;
    if (ok) break;
    while (1) {
      bool ok = false;
      for (int i = 0; i < (int)(4); i++) {
        P q = p.Div(i);
        if (!(q == p)) {
          p = q;
          res.push_back(string("/") + (char)('1' + i));
          ok = true;
        }
      }
      if (!ok) break;
    }
    for (int i = 0; i < (int)(3); i++) {
      int j = (ss + i) % 4;
      if (p[j] & 1) {
        p = p.Plus(j);
        res.push_back(string("+") + (char)('1' + j));
      }
    }
    ss++;
  }
  return res;
}
int main() {
  for (int i = 0; i < (int)(4); i++) ONE[i] = 1;
  P p;
  p.Scan();
  vector<string> res1 = PRE(p);
  vector<string> res2 = BFS(p);
  if (res2 == vector<string>(1, "-1"))
    printf("-1\n");
  else {
    for (int i = 0; i < (int)(res1.size()); i++)
      printf("%s\n", res1[i].c_str());
    for (int i = 0; i < (int)(res2.size()); i++)
      printf("%s\n", res2[i].c_str());
  }
  return 0;
}
