#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;
}
