#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using ull = unsigned long long;

mt19937 mt(736);

const int n = (int) 2e5;


ull simulate(const vector<tuple<char, int, int, int>> &arr, int a, int b)
{
	static array<ull, n> mem{};

	fill(mem.begin(), mem.end(), 0);

	mem[0] = a;
	mem[1] = b;

	unordered_set<int> watch = {2, 251, 54, 403};

	for (auto it : arr)
	{
		if (get<0>(it) == '+')
		{
			mem[get<3>(it)] = mem[get<1>(it)] + mem[get<2>(it)];
			if (watch.count(get<3>(it)))
			{
				assert(get<1>(it) == get<3>(it) || get<2>(it) == get<3>(it));
				auto wh = get<1>(it) ^get<2>(it) ^get<3>(it);
//				if (mem[wh] != 0)
//					cerr << "watch (" << get<3>(it) << "):\t" << mem[wh] << endl;
			}
		}
		else
			mem[get<3>(it)] = mem[get<1>(it)] < mem[get<2>(it)] ? 1 : 0;
	}

	return mem[2];
}


const int max_pw = 31;


void solve(istream &cin = std::cin, ostream &cout = std::cout)
{
	vector<tuple<char, int, int, int>> arr;

	const auto zero = n - 1;
	const auto one = zero - 1;

	arr.emplace_back('+', 0, 1, one);
	arr.emplace_back('<', zero, one, one);

	for (int i = 2; i < max_pw; i++)
		arr.emplace_back('+', zero - (i - 1), zero - (i - 1), zero - i);

	const auto a = 0;
	const auto b = 1;

	auto repow = [&arr](int wh)
	{
		for (int i = 1; i <= max_pw; i++)
			arr.emplace_back('+', wh + i - 1, wh + i - 1, wh + i);
	};

	auto mul1 = [&arr, zero, one, &repow](int a, int q, int out)
	{
		const auto aeq = 3;
		const auto t = aeq + 1;

		arr.emplace_back('+', a, one, aeq);
		arr.emplace_back('+', zero, one, t);
		repow(t);

		const auto asum = t + 50;
		arr.emplace_back('<', asum, asum, asum);

		for (int pw = max_pw; pw >= 0; pw--)
		{
			const auto tmp = asum + 1;
			arr.emplace_back('+', asum, t + pw, tmp);
			const auto add = tmp + 1;
			arr.emplace_back('<', tmp, aeq, add);
			repow(add);
			arr.emplace_back('+', asum, add + pw, asum);
			const auto to = add + 50;
			arr.emplace_back('+', add, q, to);
			arr.emplace_back('<', one, to, to);
			repow(to);
			arr.emplace_back('+', out, to + pw, out);
		}
	};

	const auto aeq = 200;
	const auto t = aeq + 1;

	arr.emplace_back('+', a, one, aeq);
	arr.emplace_back('+', zero, one, t);
	repow(t);

	const auto asum = t + 50;
	arr.emplace_back('<', asum, asum, asum);

	for (int pw = max_pw; pw >= 0; pw--)
	{
		const auto tmp = asum + 1;
		arr.emplace_back('+', asum, t + pw, tmp);
		const auto add = tmp + 1;
		arr.emplace_back('<', tmp, aeq, add);
		repow(add);
		arr.emplace_back('+', asum, add + pw, asum);
		const auto to = add + 50;
		const auto q = to + 100;
		arr.emplace_back('<', q, q, q);
		arr.emplace_back('+', add, zero, to);
		mul1(b, to, q);
		repow(q);
		arr.emplace_back('+', 2, q + pw, 2);
	}

	assert(arr.size() < n);

	for (int ta = 0; ta <= 10; ta++)
		for (int tb = 0; tb <= 10; tb++)
		{
			auto val = simulate(arr, ta, tb);
			cerr << ta << " * " << tb << " = " << val << endl;
			assert(simulate(arr, ta, tb) == ta * tb);
		}
	assert(simulate(arr, 1e9, 1e9) == (ll) 1e18);
	assert(simulate(arr, 1e3, 1e6) == (ll) 1e9);

	cout << arr.size() << endl;

	for (const auto &it : arr)
	{
		char op;
		int ta, tb, tc;

		tie(op, ta, tb, tc) = it;

		cout << op << ' ' << ta << ' ' << tb << ' ' << tc << endl;
	}
}


int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	cout << fixed;

#ifdef LOCAL
	auto st = clock();

	ifstream fin("../input.txt");

	do
	{
		solve(fin);

		cout << "===" << endl;

		string str;
		while (getline(fin, str) && str != string(max(1, (int) str.size()), '='));
	} while (fin);

	cout << setprecision(6) << "clock: " << double(clock() - st) / CLOCKS_PER_SEC << endl;
#else
	solve();
#endif

	return 0;
}


Measured memory_bytes: 6028