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;
struct osc {
  int x;
  long long y, z;
} ans[100050];
long long n, sum;
int main() {
  scanf("%lld", &n);
  ans[++sum] = (osc){0, n, n};
  ans[++sum] = (osc){1, n, 2 * n};
  ans[++sum] = (osc){0, n, n ^ (2 * n)};
  long long tmp1 = n + (n ^ (2 * n)), tmp2 = tmp1;
  int high = 60, low = 0;
  for (; ((tmp1 >> high) & 1) == 0;) high--;
  for (; ((tmp1 >> low) & 1) == 0;) low++;
  for (int i = low; i < high; i++) {
    ans[++sum] = (osc){0, tmp2, tmp2};
    tmp2 = tmp2 * 2;
  }
  ans[++sum] = (osc){0, tmp1, tmp2};
  ans[++sum] = (osc){1, tmp1, tmp2};
  ans[++sum] = (osc){1, (tmp1 + tmp2), (tmp1 ^ tmp2)};
  long long tmp3 = (tmp1 + tmp2) ^ tmp1 ^ tmp2;
  for (; tmp3 != 1;) {
    for (long long tmp5 = tmp3; tmp5 < ((1LL) << 60); tmp5 <<= 1)
      ans[++sum] = (osc){0, tmp5, tmp5};
    long long tmp4 = n;
    for (int i = 60; (1LL << i) >= tmp3; i--)
      if ((tmp4 >> i) & 1) {
        ans[++sum] = (osc){1, (1LL << i), tmp4};
        tmp4 ^= (1LL << i);
      }
    for (; tmp4 != (tmp4 & (-tmp4));) {
      if (tmp4 < tmp3) {
        ans[++sum] = (osc){0, tmp4, tmp4};
        tmp4 *= 2;
      } else {
        ans[++sum] = (osc){1, tmp3, tmp4};
        tmp4 -= tmp3;
      }
    }
    tmp3 = tmp4;
  }
  printf("%lld\n", sum);
  for (int i = 1; i <= sum; i++) {
    if (ans[i].x == 0)
      printf("%lld + %lld\n", ans[i].y, ans[i].z);
    else
      printf("%lld ^ %lld\n", ans[i].y, ans[i].z);
  }
  return 0;
}