#include <bits/stdc++.h>

using namespace std;

void nmSeq(int n, int m, vector<int> &seq, vector< vector<int> > &a) {
  if (n == 0) { a.push_back(seq); return; }
  for (int i = 1; i <= m; i++) {
    seq.push_back(i);
    nmSeq(n - 1, m, seq, a);
    seq.pop_back();
  }
}

int calc1(int x[], vector<int> op) {
  int A = x[0];
  switch (op[0]) {
    case 1: A += x[1]; break;
    case 2: A -= x[1]; break;
    case 3: A *= x[1]; break;
  }
  int B = x[2];
  switch (op[2])  {
    case 1: B += x[3]; break;
    case 2: B -= x[3]; break;
    case 3: B *= x[3]; break;
  }
  switch (op[1]) {
    case 1: return A + B;
    case 2: return A - B;
    case 3: return A * B;
  }
}

int calc2(int x[], vector<int> op) {
  int A = x[0];
  switch (op[0]) {
    case 1: A += x[1]; break;
    case 2: A -= x[1]; break;
    case 3: A *= x[1]; break;
  }
  switch (op[1]) {
    case 1: A += x[2]; break;
    case 2: A -= x[2]; break;
    case 3: A *= x[2]; break;
  }
  switch (op[2]) {
    case 1: return A + x[3];
    case 2: return A - x[3];
    case 3: return A * x[3];
  }
}

int main(void) {
  int x[4];
  string ord = "+-*";
  while (true) {
    for (int i = 0; i < 4; i++) {
      cin >> x[i];
    }
    if (x[0] == 0) break;

    vector<int> a;
    vector< vector<int> > op;
    nmSeq(3, 3, a, op);

    bool none = true;
    sort(x, x + 4);
    do {
      for (int i = 0; i < op.size(); i++) {
        if (!none) break;
        if (calc1(x, op[i]) == 10) {
          printf("((%d %c %d) %c (%d %c %d))\n", x[0], ord[op[i][0] - 1], x[1], ord[op[i][1] - 1], x[2], ord[op[i][2] - 1], x[3]);
          none = false;
        } else if (calc2(x, op[i]) == 10) {
          printf("(((%d %c %d) %c %d) %c %d)\n", x[0], ord[op[i][0] - 1], x[1], ord[op[i][1] - 1], x[2], ord[op[i][2] - 1], x[3]);          
          none = false;          
        }
      }
    } while (next_permutation(x, x + 4));

    if (none) cout << 0 << endl;
  }

  return 0;
}
