#include <bits/stdc++.h>
using namespace std;
struct Node {
  long long z;
  int a, b;
  int len;
  string out() { return to_string(a) + '^' + to_string(b); }
};
bool cmp(const Node &a, const Node &b) { return a.z < b.z; }
Node zz[330000];
int numsize(long long z) {
  int r = 0;
  while (z > 0) {
    z /= 10;
    ++r;
  }
  return r;
}
int main() {
  long long n;
  cin >> n;
  int sb[100];
  for (int j = 2; j <= 34; j++) {
    sb[j] = to_string(j).size();
  }
  int total = 0;
  for (int i = 2; i <= 100000; i++) {
    long long temp = i;
    int sa = numsize(i);
    for (int j = 2; j <= 34; j++) {
      temp *= i;
      if (temp > n) break;
      Node &t = zz[total];
      ++total;
      t.z = temp;
      t.a = i;
      t.b = j;
      t.len = sa + sb[j] + 1;
    }
  }
  sort(zz, zz + total, cmp);
  int acc = 1;
  for (int i = 1; i < total; i++) {
    if (zz[i].z == zz[acc - 1].z) {
      if (zz[i].len >= zz[acc - 1].len) {
        continue;
      } else {
        --acc;
      }
    }
    zz[acc] = zz[i];
    ++acc;
  }
  total = min(total, acc);
  Node t;
  t.z = n / 2;
  auto tx = lower_bound(zz, zz + total, t, cmp);
  int x = tx - zz;
  int res = numsize(n);
  string result = to_string(n);
  for (int i = x; i < total; ++i) {
    t.z = n - zz[i].z;
    int g = zz[i].len;
    int t0;
    t0 = g + numsize(t.z);
    if (t.z > 0) t0 += 1;
    if (t0 < res) {
      res = t0;
      result = zz[i].out();
      if (t.z > 0) {
        result += '+' + to_string(t.z);
      }
    }
    tx = upper_bound(zz, zz + total, t, cmp);
    tx--;
    long long le = t.z - tx->z;
    t0 = g + 1 + tx->len + numsize(le);
    if (le > 0) t0 += 1;
    if (t0 < res) {
      res = t0;
      result = zz[i].out() + '+' + tx->out();
      if (le > 0) {
        result += '+' + to_string(le);
      }
    }
    if (false && n == 3487832977) {
      if (zz[i].z == 3486784401 && tx->z == 1048576) {
        cout << res << ' ' << t0 << ' ' << le << endl;
        cout << zz[i].out() << ' ' << tx->out() << endl;
      }
    }
  }
  for (int i = 0; i < total; ++i) {
    long long t = n / zz[i].z;
    long long le = n - zz[i].z * t;
    int t0 = numsize(t) + 1 + zz[i].len + numsize(le);
    if (le > 0) t0 += 1;
    if (t0 < res) {
      res = t0;
      result = to_string(t) + '*' + zz[i].out();
      if (le > 0) {
        result += '+' + to_string(le);
      }
    }
  }
  if (res > 9) {
    for (int i = 11111; i < 100000; i++) {
      int t = i;
      long long z[5];
      for (int j = 0; j < 5; j++) {
        z[j] = t % 10;
        t /= 10;
      }
      long long g = z[0] * pow(z[1], z[2]) + pow(z[3], z[4]);
      if (g == n) {
        result = to_string(z[0]) + '*' + to_string(z[1]) + '^' +
                 to_string(z[2]) + '+' + to_string(z[3]) + '^' +
                 to_string(z[4]);
        break;
      }
      g = z[0] + pow(z[1], z[2]) * pow(z[3], z[4]);
      if (g == n) {
        result = to_string(z[0]) + '+' + to_string(z[1]) + '^' +
                 to_string(z[2]) + '*' + to_string(z[3]) + '^' +
                 to_string(z[4]);
        break;
      }
    }
  }
  cout << result << endl;
}
