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 gcd(long long a, long long b, long long& x, long long& y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  long long x1, y1;
  long long d = gcd(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return d;
}
struct query {
  long long a, b;
  char c;
  query() {}
  query(long long a, long long b, char c) : a(a), b(b), c(c) {}
};
vector<query> res;
void get_mul(long long x, long long n) {
  if (n == 1) return;
  if (n % 2 == 0) {
    get_mul(x, n / 2);
    res.push_back(query(x * n / 2, x * n / 2, '+'));
    return;
  }
  get_mul(x, n - 1);
  res.push_back(query(x * (n - 1), x, '+'));
}
signed main() {
  long long n;
  cin >> n;
  set<long long> s;
  s.insert(n);
  long long a, b = -1;
  while (1) {
    long long sm = *s.begin();
    auto uk = s.end();
    long long bg = *(--uk);
    res.push_back(query(sm, bg, '+'));
    long long nv = sm + bg;
    vector<long long> nxt;
    for (long long elem : s) {
      res.push_back(query(bg, nv, '^'));
      nxt.push_back(bg ^ nv);
      break;
    }
    s.insert(nv);
    for (long long elem : nxt) s.insert(elem);
    for (auto x1 : s) {
      for (auto x2 : s) {
        long long g = gcd(x1, x2, a, b);
        if (g == 1) {
          if (a < 0) {
            a *= -1;
            b *= -1;
          }
          long long v1 = x1 * a;
          long long v2 = x2 * (-b);
          if ((v1 ^ v2) == 1) {
            get_mul(x1, a);
            get_mul(x2, (-b));
            res.push_back(query(v1, v2, '^'));
            cout << res.size() << endl;
            for (auto elem : res) {
              cout << elem.a << " " << elem.c << " " << elem.b << endl;
            }
            return 0;
          }
        }
      }
    }
  }
  return 0;
}