//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define trav(x,a) for (const auto& x: a)
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), x.end()
#define mem(a,v) memset((a), (v), sizeof (a))
#define enl printf("\n")
#define case(t) printf("Case #%d: ", (t))
#define ni(n) scanf("%d", &(n))
#define nl(n) scanf("%lld", &(n))
#define nai(a, n) for (int _i = 0; _i < (n); _i++) ni(a[_i])
#define nal(a, n) for (int _i = 0; _i < (n); _i++) nl(a[_i])
#define pri(n) printf("%d\n", (n))
#define prl(n) printf("%lld\n", (n))
#define pii pair<int, int>
#define pll pair<long long, long long>
#define vii vector<pii>
#define vll vector<pll>
#define vi vector<int>
#define vl vector<long long>
#define pb push_back
#define mp make_pair
#define st first
#define nd second
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef cc_hash_table<int,int,hash<int>> ht;
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> oset;
const double pi = acos(-1);
const int mod = 1e9 + 7;
const int inf = 1e9 + 7;
const int N = 1e6 + 5;
const double eps = 1e-9;
vector<array<int,4>> ans;
const int LG = 30;
int pw2[LG];
int cnt = 0;

void add(int i, int j, int k) {
  ans.pb({0, i, j, k});
}

void comp(int i, int j, int k) {
  ans.pb({1, i, j, k});
}

void createp2() {
  add(0, 1, 3);
  comp(2, 3, 4);
  cnt = 4;
  pw2[0] = cnt;
  for (int i = 1; i < LG; i++) {
    pw2[i] = ++cnt;
    add(pw2[i-1], pw2[i-1], pw2[i]);
  }
}

void shift(int i, int it) {
  add(i, cnt+1, cnt+1); ++cnt;
  for (int j = 1; j <= it; j++) {
    add(cnt, cnt, cnt+1); ++cnt;
  }
}

vector<int> check;

vector<int> find_bin(int i) {
  vector<int> ret(LG, 0);
  int lst = ++cnt;
  add(i, pw2[0], lst); i = lst;
  // check.push_back(lst);
  lst = ++cnt;
  for (int it = LG-1; it >= 0; it--) {
    add(lst, pw2[it], ++cnt); // lst + (1 << it)
    comp(cnt, i, cnt+1); // lst + (1 << it) < i
    ret[it] = ++cnt;
    shift(ret[it], it);
    add(lst, cnt, cnt+1); // lst += 1 << it
    lst = ++cnt;
  }
  return ret;
}

void mul(int i, int j) {
  comp(i, pw2[0], ++cnt);
  comp(cnt, j, cnt+1); ++cnt;
}

int main() {
  ios_base::sync_with_stdio(false); cin.tie(0);
  createp2();
  vector<int> a = find_bin(0);
  vector<int> b = find_bin(1);
  vector<int> c(2*LG-1);
  for (int i = 0; i < 2*LG-1; i++)
    c[i] = ++cnt;
  for (int i = 0; i < LG; i++)
    for (int j = 0; j < LG; j++) {
      mul(a[i], b[j]);
      add(cnt, c[i+j], c[i+j]);
    }
  for (int i = 0; i < 2*LG-1; i++) {
    shift(c[i], i);
    add(2, cnt, 2);
  }
  // add(0, 1, 3);
  // comp(0, 3, 5);
  // for (int i = 2; i <= 10; i++)
  //   add(5, 5+i-2, 5+i-1);
  // for (int i = 1; i <= 10; i++)
  //   comp(i+3, 1, 15+i-1); // bx1
  // for (int i = 1; i <= 10; i++)
  //   comp(0, i+4, 25+i-1);
  // int cnt = 35;
  // for (int i = 15; i <= 24; i++) {
  //   for (int j = 25; j <= 34; j++) {
  //     comp(j, i, cnt);
  //     cnt++;
  //   }
  // }
  // for (int i = 35; i < cnt; i++)
  //   add(i, 2, 2);
  cout << sz(ans) << "\n";
  trav(x, ans) {
    if (x[0] == 0)
      cout << "+";
    else
      cout << "<";
    for (int i = 1; i < 4; i++)
      cout << " " << x[i];
    cout << "\n";
  }
  return 0;
}


Measured memory_bytes: 3708