#include<bits/stdc++.h>
#define LL long long
#define pb push_back
#define SZ(x) ((int)x.size()-1)
#define ms(a,b) memset(a,b,sizeof a)
#define F(i,a,b) for (int i=(a);i<=(b);++i)
#define DF(i,a,b) for (int i=(a);i>=(b);--i)
using namespace std;
inline int read(){
	char ch=getchar(); int w=1,c=0;
	for(;!isdigit(ch);ch=getchar()) if (ch=='-') w=-1;
	for(;isdigit(ch);ch=getchar()) c=(c<<1)+(c<<3)+(ch^48);
	return w*c;
}
const int M=100;
struct node{
	bool op;
	int x,y,z;
	node(bool _op=0,int _x=0,int _y=0,int _z=0){
		op=_op; x=_x; y=_y; z=_z;
	}
};
LL pw[M];
int B=100,ZERO=1e5,ONE=B,SUM=B*10,ANS=2;
vector<node> ans;
void GETBIT(int ind,int tmp,int BEG,bool *t){
	ans.pb(node(1,ind,ONE,ind));//target+1
	DF(i,30,0){
		ans.pb(node(1,tmp,B+i,tmp+1));//add
		ans.pb(node(0,tmp+1,ind,tmp+1));//compare
		ans.pb(node(0,ZERO,tmp+1,BEG+i));//restore
		F(j,1,i) ans.pb(node(1,tmp+1,tmp+1,tmp+1));//pow
		ans.pb(node(1,tmp+1,tmp,tmp));//add
	}
}
bool ta[M],tb[M]; 
int main(){
	ans.pb(node(1,0,1,SUM));
	ans.pb(node(0,ZERO,SUM,ONE)); pw[0]=1;
	F(i,1,60) pw[i]=pw[i-1]*2,ans.pb(node(1,B+i-1,B+i-1,B+i));
	GETBIT(0,5*B,2*B,ta);
	GETBIT(1,6*B,3*B,tb);
	DF(i,60,0){
		ans.pb(node(1,ANS,ANS,ANS));
		int tmp=7*B+i;
		F(j,0,min(30,i)){
			int k=i-j;
			if (j<=30 && k<=30){
				ans.pb(node(1,2*B+j,3*B+k,tmp+1));
				ans.pb(node(0,ONE,tmp+1,tmp+1));
				ans.pb(node(1,tmp+1,ANS,ANS));
			}
		}
	}
	cout<<SZ(ans)+1<<"\n";
	F(i,0,SZ(ans)){
		cout<<(ans[i].op ? "+ " : "< ")<<ans[i].x<<" "<<ans[i].y<<" "<<ans[i].z<<"\n";
	}
	return 0;
}
