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;
long long a[105];
int n, bt, c[105], p2, ct;
long long b[1000005];
char buf[10000005];
set<long long> st;
void ins(long long x) {
  for (int i = 62; i >= 0; i--)
    if (x & (1ll << i)) {
      if (!a[i]) {
        a[i] = x;
        return;
      } else {
        if (st.find(x ^ a[i]) == st.end()) {
          sprintf(buf + p2, "%lld ^ %lld\n", a[i], x);
          while (buf[p2]) p2++;
          ct++;
          b[++bt] = x ^ a[i];
          st.insert(x ^ a[i]);
        }
        x ^= a[i];
      }
    }
  return;
}
bool check(long long x) {
  for (int i = 62; i >= 0; i--)
    if (x & (1ll << i)) {
      if (!a[i])
        return 1;
      else
        x ^= a[i];
    }
  return 0;
}
int main() {
  srand(time(0));
  scanf("%d", &n);
  b[++bt] = n;
  st.insert(n);
  for (int i = 1;; i++) {
    long long x = b[rand() % bt + 1], y = b[rand() % bt + 1], fl = 0, nw;
    if (!fl)
      nw = x + y;
    else
      nw = x ^ y;
    if (st.find(nw) != st.end() || nw > 1e18 || !nw) {
      i--;
      continue;
    }
    if (check(nw) || rand() % 1000 == 0) {
      sprintf(buf + p2, "%lld %c %lld\n", x, fl ? '^' : '+', y);
      while (buf[p2]) p2++;
      ct++;
      b[++bt] = nw;
      st.insert(nw);
      if (check(nw)) ins(nw);
      if (a[0]) {
        printf("%d\n", ct);
        printf("%s", buf);
        return 0;
      }
      continue;
    }
    i--;
  }
  return 0;
}