#include <bits/stdc++.h>
using namespace std;
const int N = 40 + 7;
int d, p, tot, g[N], op[N], og[N], cnt[N], w[N][N];
struct poly {
  int f[N];
} s[N];
inline poly operator*(poly u, long long v) {
  for (int i = 0; i <= d; i++) u.f[i] = u.f[i] * v % p;
  return u;
}
inline poly operator-(poly u, poly t) {
  for (int i = 0; i <= d; i++) u.f[i] = (u.f[i] - t.f[i] + p) % p;
}
inline long long pows(long long u, int v) {
  long long ans = 1;
  while (v > 0) {
    if (v & 1) ans = ans * u % p;
    u = u * u % p, v = v >> 1;
  }
  return ans;
}
inline int binom(int a, int b) {
  long long ans = 1;
  for (int i = 1; i <= b; i++) ans = ans * (a - i + 1) % p * pows(i, p - 2) % p;
  return ans;
}
inline int getk(int d, int c) {
  if (c <= 1) c += p;
  op[0] = d, g[0] = 0;
  for (int i = 1; i <= 31; i++)
    printf("+ %d %d %d\n", op[i - 1], op[i - 1], tot + 1), op[i] = ++tot;
  for (int i = 0; i <= 31; i++)
    if (c & (1 << i)) g[++g[0]] = op[i];
  for (int i = 1; i < g[0]; i++) printf("+ %d %d %d\n", g[i], g[g[0]], g[g[0]]);
  return g[g[0]];
}
inline int getsum(int u, int c) {
  if (c == 0) {
    int z = getk(cnt[1], p);
    printf("+ %d %d %d\n", z, u, ++tot);
    return tot;
  }
  printf("+ %d %d %d\n", u, cnt[c], ++tot);
  return tot;
}
inline int getans(int u) {
  memset(s, 0, sizeof(s));
  for (int i = 0; i <= d; i++) s[i].f[i] = 1;
  for (int i = 0; i <= d; i++)
    for (int j = 0; j <= d; j++) w[i][j] = binom(d, j) * pows(i, d - j) % p;
  for (int i = 0; i <= d; i++) {
    int pos = i;
    for (int j = i; j <= d; j++)
      if (w[j][i]) pos = j;
    for (int j = i; j <= d; j++) swap(w[pos][j], w[i][j]);
    for (int z = 0; z <= d; z++) swap(s[i].f[z], s[pos].f[z]);
    for (int j = i + 1; j <= d; j++) {
      long long v = pows(w[i][i], p - 2) * w[j][i] % p;
      for (int k = 0; k <= d; k++)
        w[j][k] = ((w[j][k] - w[i][k] * v % p) % p + p) % p;
      for (int z = 0; z <= d; z++)
        s[j].f[z] = ((s[j].f[z] - s[i].f[z] * v) % p + p) % p;
    }
  }
  for (int i = d; i >= 0; i--) {
    for (int z = 0; z <= d; z++)
      s[i].f[z] = s[i].f[z] * pows(w[i][i], p - 2) % p;
    for (int x = 0; x < i; x++)
      for (int z = 0; z <= d; z++)
        s[x].f[z] = ((s[x].f[z] - 1ll * s[i].f[z] * w[x][i]) % p + p) % p;
  }
  int h = 0;
  for (int i = 0; i <= d; i++) cerr << s[2].f[i] << endl;
  for (int i = 0; i <= d; i++) {
    int z = getsum(u, i);
    if (s[2].f[i] == 0) continue;
    printf("^ %d %d\n", z, ++tot), z = tot;
    if (h == 0)
      h = getk(z, (s[2].f[i] - 1 + p) % p + 1);
    else {
      int w = ++tot;
      printf("+ %d %d %d\n", h, getk(z, (s[2].f[i] - 1 + p) % p + 1), w);
      h = w;
    }
  }
  return h;
}
int main() {
  cin >> d >> p, tot = 3, cnt[1] = 3;
  for (int i = 2; i <= d; i++)
    printf("+ %d 3 %d\n", cnt[i - 1], ++tot), cnt[i] = tot;
  printf("+ 1 2 %d\n", ++tot);
  int a = 1, b = 2, c = tot;
  a = getans(a), b = getans(b), c = getans(c);
  a = getk(a, p - 1), b = getk(b, p - 1);
  printf("+ %d %d %d\n", c, a, c);
  printf("+ %d %d %d\n", c, b, c);
  c = getk(c, (p + 1) / 2);
  printf("f %d\n", c);
  return 0;
}
