#include <bits/stdc++.h>   using namespace std;   template <class T>   inline void gmin(T &x, const T &y) {     x = x > y ? y : x;   }   template <class T>   inline void gmax(T &x, const T &y) {     x = x < y ? y : x;   }   template <class T>   inline bool Gmin(T &x, const T &y) {     return x > y ? x = y, 1 : 0;   }   template <class T>   inline bool Gmax(T &x, const T &y) {     return x < y ? x = y, 1 : 0;   }   const int BufferSize = 1 << 16;   char buffer[BufferSize], *Bufferhead, *Buffertail;   bool Terminal;   inline char Getchar() {     if (Bufferhead == Buffertail) {       int l = fread(buffer, 1, BufferSize, stdin);       if (!l) {         Terminal = 1;         return 0;       }       Buffertail = (Bufferhead = buffer) + l;     }     return *Bufferhead++;   }   template <class T>   inline bool read(T &x) {     x = 0;     char c = Getchar(), rev = 0;     while (c <  0  || c >  9 ) {       rev |= c ==  - ;       c = Getchar();       if (Terminal) return 0;     }     while (c >=  0  && c <=  9 ) x = x * 10 + c -  0 , c = Getchar();     if (c ==  . ) {       c = Getchar();       double t = 0.1;       while (c >=  0  && c <=  9 )         x = x + (c -  0 ) * t, c = Getchar(), t = t / 10;     }     x = rev ? -x : x;     return 1;   }   template <class T1, class T2>   inline bool read(T1 &x, T2 &y) {     return read(x) & read(y);   }   template <class T1, class T2, class T3>   inline bool read(T1 &x, T2 &y, T3 &z) {     return read(x) & read(y) & read(z);   }   template <class T1, class T2, class T3, class T4>   inline bool read(T1 &x, T2 &y, T3 &z, T4 &w) {     return read(x) & read(y) & read(z) & read(w);   }   inline bool reads(char *x) {     char c = Getchar();     while (c < 33 || c > 126) {       c = Getchar();       if (Terminal) return 0;     }     while (c >= 33 && c <= 126) (*x++) = c, c = Getchar();     *x = 0;     return 1;   }   template <class T>   inline void print(T x, const char c =   n ) {     if (!x) {       putchar( 0 );       putchar(c);       return;     }     if (x < 0) putchar( - ), x = -x;     int m = 0, a[20];     while (x) a[m++] = x % 10, x /= 10;     while (m--) putchar(a[m] +  0 );     putchar(c);   }   const int inf = 0x3f3f3f3f;   const int N = 25, M = 5005;   int mod = 1e9 + 7;   template <class T, class S>   inline void ch(T &x, const S y) {     x = (x + y) % mod;   }   inline int exp(int x, int y, const int mod = ::mod) {     int ans = 1;     while (y) {       if (y & 1) ans = (long long)ans * x % mod;       x = (long long)x * x % mod;       y >>= 1;     }     return ans;   }   int cell[M], CNT;   int c, c0, c1, c2, cnt, d, O, L = 2, R = 5001;   inline int sum(int x, int y, int k = 0) {     if (!k) k = ++L;     printf( + %d %d %d n , x, y, k);     ++CNT;     cell[k] = (cell[x] + cell[y]) % mod;     return k;   }   inline int power(int x, int k = 0) {     if (!k) k = ++L;     printf( ^ %d %d n , x, k);     ++CNT;     cell[k] = exp(cell[x], d);     return k;   }   inline int zero() {     int ans = --R, t = --R, y = mod - 1;     while (y) {       t = sum(t, t, t);       y >>= 1;       if (y & 1) ans = sum(ans, t);     }     return ans;   }   inline int multi(int x, int y) {     int k = --R;     int ans = sum(O, O, k), t = sum(x, O, --R);     while (y) {       if (y & 1) ans = sum(ans, t, ans);       t = sum(t, t, t);       y >>= 1;     }     return ans;   }   inline int neg(int x) { return multi(x, mod - 1); }   inline int sub(int x, int y) {     int t = neg(y);     return sum(x, t, t);   }   inline int sqr(int x) {     int a[N], b = ++L;     b = multi(b, c);     a[0] = multi(x, 1);     for (int i = 1; i <= cnt; i++) a[i] = sum(a[i - 1], b);     for (int i = 0; i <= cnt; i++) a[i] = power(a[i]);     for (int i = 1; i <= cnt; i++)       for (int j = 0; j <= cnt - i; j++) a[j] = sub(a[j + 1], a[j]);     int t = ++L;     a[0] = sub(a[0], sum(multi(x, c1), multi(++L, c0)));     a[0] = multi(a[0], exp(c2, mod - 2));     return a[0];   }   inline int find(int c, int &c2, int &c1, int &c0, int &cnt) {     static int a[N], pw[N];     static int C[N][N];     for (int i = 0; i < d; i++) a[i] = 0;     a[d] = 1;     pw[0] = 1;     for (int i = 1; i <= d; i++) pw[i] = (long long)pw[i - 1] * c % mod;     for (int i = 0; i <= d; i++) {       C[i][i] = C[i][0] = 1;       for (int j = 1; j < i; j++) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;     }     int m = d;     cnt = 0;     while (m > 2) {       cnt++;       for (int i = 0; i <= m; i++) {         for (int j = 0; j < i; j++)           ch(a[j], (long long)C[i][j] * a[i] % mod * pw[i - j]);         a[i] = 0;       }       while (m >= 0 && !a[m]) m--;     }     if (m == 2) {       c2 = a[2], c1 = a[1], c0 = a[0];       return 1;     }     return 0;   }   int main() {     for (int i = 1; i <= 5000; i++) cell[i] = 1;     scanf( %d%d , &d, &mod);     int x = 1, y = 2;     cell[x] = rand() % mod;     cell[y] = rand() % mod;     O = zero();     while (1) {       c = rand() % mod;       if (find(c, c2, c1, c0, cnt)) break;     }     int p1 = sqr(sum(x, y)), p2 = sqr(sub(x, y));     int g = sub(p1, p2), ans = multi(g, exp(4, mod - 2));     printf( f %d n , ans);     if (cell[ans] ^ (1ll * cell[x] * cell[y] % mod)) fprintf(stderr,  false );     cerr <<  CNT           <<  =  << CNT << endl;     cerr <<  cnt           <<  =  << cnt << endl;     return 0;   }