#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#define FILENAME(x) \
freopen(x".in","r",stdin); \
freopen(x".out","w",stdout);
#define MAXIOLG 25
#define LOWBIT(x) ((x)&(-(x)))
#define MOD 998244353
#define MD(x) (((x)>=MOD)?((x)-=MOD):(0))
#define OPS "?+<?"
#define N 299
#define MXLG 60
using namespace std;

typedef long long ll;
typedef ll io_t;

io_t shin[MAXIOLG];
io_t seto(void);
void ayano(io_t x,char spliter='\n');

struct Ene{
    int op,x,y,z;
    Ene(void):op(0),x(0),y(0),z(0){}
    Ene(int tp,int tx,int ty,int tz):op(tp),x(tx),y(ty),z(tz){}
    Ene(const Ene& tc):op(tc.op),x(tc.x),y(tc.y),z(tc.z){}
};

vector<Ene> vec;

void make_pw(void);
void sub(int x,int y,int z,int k);
void to_bin(int x,int l,int k);
void to_dec(int x,int l,int k);
void mult(int l1,int l2,int l3,int k);
void lmv(int x,int k);
void land(int x,int y,int z);
void add(int x,int y,int z);
void les(int x,int y,int z);

int main(void){
    make_pw();
    to_bin(0,30,30);
    to_bin(1,70,30);
    mult(30,70,110,30);
    to_dec(2,110,60);
    //vec.push_back(Ene());
    ayano(vec.size());
    for (auto v:vec){
        putchar(OPS[v.op]),putchar(' '),
        ayano(v.x,' '),ayano(v.y,' '),ayano(v.z);
    }
    return 0;
}

void sub(int x,int y,int z,int k){
    add(y,3,16); //arr[16]=0+arr[y];
    for (int tlg=k;tlg>=0;tlg--){
        add(16,N-tlg,17); //arr[17]=arr[16]+(1<<tlg);
        les(17,x,18); //arr[18]=(arr[17]<arr[x]);
        lmv(18,tlg);
        add(z,18,z); //arr[z]=arr[18]+arr[z];
        add(16,18,16); //arr[16]=arr[18]+arr[16];
    }
    les(y,x,18);
    add(z,18,z); //arr[z]=arr[z]+(arr[y]<arr[x]);
}
void mult(int l1,int l2,int l3,int k){
    for (int i=0;i<=k;i++){
        for (int j=0;j<=k;j++){
            int res=i+j;
            land(l1+i,l2+j,14);
            add(14,l3+res,l3+res);
        }
    }
}
void to_dec(int x,int l,int k){
    for (int i=k;i>=0;i--){
        add(x,x,x);
        add(x,l+i,x);
    }
}
void to_bin(int x,int l,int k){
    add(x,N,13); //arr[13]=1+arr[x];
    add(3,3,11); //arr[11]=0+0;
    //Position 11 saves the certain sum
    //Position 12 is used to try
    //Position 13 saves arr[x]+1
    for (int tlg=k;tlg>=0;tlg--){
        add(N-tlg,11,12); //arr[12]=arr[11]+(1<<k);
        les(12,13,12); //arr[12]=(arr[12]<arr[13]);
        add(12,3,l+tlg); //arr[l+tlg]=arr[12]+0;
        lmv(12,tlg);
        add(11,12,11); //arr[11]=arr[11]+arr[12];
    }
}
void make_pw(void){
    add(0,1,N);
    les(3,N,N);
    for (int i=1;i<=MXLG;i++)
        add(N-i+1,N-i+1,N-i);
}
void lmv(int x,int k){
    while (k--)
        add(x,x,x);
}
void land(int x,int y,int z){
    add(x,y,4);
    les(N,4,z);
}
void add(int x,int y,int z){
    vec.push_back(Ene(1,x,y,z));
}
void les(int x,int y,int z){
    vec.push_back(Ene(2,x,y,z));
}

io_t seto(void){
    io_t x=0;
    char ch=getchar();
    int symbol=0;
    while (!isdigit(ch))
        (ch=='-')?(symbol=1):(0),
        ch=getchar();
    while (isdigit(ch))
        x=(x*10)+(ch-'0'),
        ch=getchar();
    return (symbol)?(-x):(x);
}
void ayano(io_t x,char spliter){
    if (!x){
        putchar('0'),putchar(spliter);
        return;
    }
    if (x<0)
        putchar('-'),x=-x;
    int ren=0;
    while (x){
        io_t d=x/10;
        shin[ren++]=x-d*10;
        x=d;
    }
    while (ren--)
        putchar(shin[ren]+'0');
    putchar(spliter);
}


Measured memory_bytes: 3092