Problem: You have a blackboard and initially only an odd number x is written on it. Your goal is to write the number 1 on the blackboard.

You may write new numbers on the blackboard with the following two operations. 

  * You may take two numbers (not necessarily distinct) already on the blackboard and write their sum on the blackboard. The two numbers you have chosen remain on the blackboard. 
  * You may take two numbers (not necessarily distinct) already on the blackboard and write their [bitwise XOR](https://en.wikipedia.org/wiki/Bitwise_operation#XOR) on the blackboard. The two numbers you have chosen remain on the blackboard. 

Perform a sequence of operations such that at the end the number 1 is on the blackboard.

Input

The single line of the input contains the odd integer x (3 ≤ x ≤ 999,999).

Output

Print on the first line the number q of operations you perform. Then q lines should follow, each describing one operation. 

  * The "sum" operation is described by the line "a + b", where a, b must be integers already present on the blackboard. 
  * The "xor" operation is described by the line "a ^ b", where a, b must be integers already present on the blackboard. 

The operation symbol (+ or ^) must be separated from a, b by a whitespace.

You can perform at most 100,000 operations (that is, q≤ 100,000) and all numbers written on the blackboard must be in the range [0, 5⋅10^{18}]. It can be proven that under such restrictions the required sequence of operations exists. You can output any suitable sequence of operations.

Examples

Input


3


Output


5
3 + 3
3 ^ 6
3 + 5
3 + 6
8 ^ 9


Input


123


Output


10
123 + 123
123 ^ 246
141 + 123
246 + 123
264 ^ 369
121 + 246
367 ^ 369
30 + 30
60 + 60
120 ^ 121

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
vector<string> vec_splitter(string s) {
  for (char &c : s) c = c == ',' ? ' ' : c;
  stringstream ss;
  ss << s;
  vector<string> res;
  for (string z; ss >> z; res.push_back(z))
    ;
  return res;
}
void debug_out(vector<string> args, int idx) { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(vector<string> args, int idx, Head H, Tail... T) {
  if (idx > 0) cerr << ", ";
  stringstream ss;
  ss << H;
  cerr << args[idx] << " = " << ss.str();
  debug_out(args, idx + 1, T...);
}
void localTest() {}
vector<pair<long long, pair<char, long long>>> ans;
long long xorOp(long long a, long long b) {
  ans.push_back({a, {'^', b}});
  return a ^ b;
}
long long addOp(long long a, long long b) {
  ans.push_back({a, {'+', b}});
  return a + b;
}
long long mulOp(long long n, long long a) {
  long long ret = n;
  a--;
  while (a > 0) {
    if (a & 1) {
      ret = addOp(n, ret);
    }
    a >>= 1;
    n = addOp(n, n);
  }
  return ret;
}
long long shiftOp(long long n, long long a) {
  while (a--) {
    n = addOp(n, n);
  }
  return n;
}
long long gcd(long long a, long long b) {
  if (a < b) {
    swap(a, b);
  }
  if (!b) {
    return a;
  }
  return gcd(b, a % b);
}
long long gcd(long long a, long long b, long long &x, long long &y) {
  if (!b) {
    x = 1;
    y = 0;
    return a;
  }
  long long x1, y1, d = gcd(b, a % b, x1, y1);
  x = y1;
  y = x1 - y1 * (a / b);
  return d;
}
int main() {
  localTest();
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long x, ox;
  cin >> x;
  ox = x;
  if (x % 4 == 3) {
    addOp(x, x);
    x = xorOp(x, 2 * x);
  }
  if (x != 1) {
    long long msb = 0;
    while (x >= (1LL << (msb + 1))) {
      msb++;
    }
    long long sx = shiftOp(x, msb);
    xorOp(x, sx);
    addOp(x, sx);
    long long val = xorOp(x + sx, x ^ sx);
    long long a, b;
    long long g = gcd(ox, val, a, b);
    long long y, y1;
    assert(g == 1);
    if (a <= 0) {
      while (a <= 0) {
        a += val;
        b -= ox;
      }
      if (abs(b) % 2) {
        b -= ox;
        a += val;
      }
      y = mulOp(val, -b);
      y1 = mulOp(ox, a);
    } else {
      if (abs(b) % 2) {
        b -= ox;
        a += val;
      }
      y = mulOp(val, -b);
      y1 = mulOp(ox, a);
    }
    x = xorOp(y1, y);
    assert(x == 1);
  }
  cout << ans.size() << "\n";
  for (auto p : ans) {
    cout << p.first << " " << p.second.first << " " << p.second.second << "\n";
  }
  return 0;
}