#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <fstream>
#include <cassert>
#include <cstring>
#include <unordered_set>
#include <unordered_map>
#include <numeric>
#include <ctime>
#include <bitset>
#include <complex>
#include <chrono>
#include <random>
#include <functional>

using namespace std;

int pnt = 3;

vector<tuple<int, int, int, int>> out;

int op(int type, int i, int j) {
	out.push_back(make_tuple(type, i, j, pnt));
	pnt++;
	return pnt - 1;
}

int ONE = -1;
vector<int> PWS;

vector<int> make_bits(int POS) {
	int plus_one = op(0, POS, ONE);
	vector<int> bits(32);
	int cur = op(0, pnt, pnt);
	for (int i = 31; i >= 0; i--) {
		int cur_add = op(0, cur, PWS[i]);
		int cur_less = op(1, cur_add, plus_one);
		bits[i] = cur_less;
		for (int j = 0; j < i; j++) {
			cur_less = op(0, cur_less, cur_less);
		}
		cur = op(0, cur, cur_less);
	}
	return bits;
}

signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	int some_bigger = op(0, 0, 1);
	some_bigger = op(0, some_bigger, some_bigger);
	ONE = op(1, 0, some_bigger);
	PWS = {ONE};
	for (int i = 1; i < 32; i++) {
		PWS.push_back(op(0, PWS.back(), PWS.back()));
	}
	vector<int> bits_a = make_bits(0);
	vector<int> bits_b = make_bits(1);
	//in bits_a all 
	//0 -> 0
	//1 -> b
	for (int i = 0; i < 32; i++) {
		vector<int> and_bits(32);
		for (int j = 0; j < 32; j++) {
			int sm = op(0, bits_a[i], bits_b[j]);
			and_bits[j] = op(1, ONE, sm);
		}
		int C = op(0, pnt, pnt);
		for (int j = 31; j >= 0; j--) {
			C = op(0, C, C);
			C = op(0, C, and_bits[j]);
		}
		bits_a[i] = op(0, 2, C);
	}
	int C = op(0, pnt, pnt);
	for (int i = 31; i >= 0; i--) {
		C = op(0, C, C);
		C = op(0, C, bits_a[i]);
	}
	out.push_back(make_tuple(0, 2, C, 2));
	cout << out.size() << endl;
	for (auto x : out) {
		if (!get<0>(x)) {
			cout << "+ ";
		} else {
			cout << "< ";
		}
		cout << get<1>(x) << ' ' << get<2>(x) << ' ' << get<3>(x) << '\n';
	}
}