#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const long long Inf = 1e18;
const int N = 20;
int n, mod, C[N][N], a[N][N], ans[N], tot = 0;
int gi() {
  int x = 0, o = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') o = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * o;
}
template <typename T>
bool chkmax(T &a, T b) {
  return a < b ? a = b, 1 : 0;
};
template <typename T>
bool chkmin(T &a, T b) {
  return a > b ? a = b, 1 : 0;
};
int add(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
int sub(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
void inc(int &a, int b) { a = (a + b >= mod ? a + b - mod : a + b); }
void dec(int &a, int b) { a = (a - b < 0 ? a - b + mod : a - b); }
int qpow(int a, int b) {
  int ret = 1;
  while (b) {
    if (b & 1) ret = 1ll * ret * a % mod;
    a = 1ll * a * a % mod, b >>= 1;
  }
  return ret;
}
void gauss() {
  for (int i = 0; i <= n; i++) {
    for (int j = i; j <= n; j++)
      if (a[j][i]) {
        swap(a[i], a[j]);
        break;
      }
    int inv = qpow(a[i][i], mod - 2);
    for (int j = i; j <= n + 1; j++) a[i][j] = 1ll * a[i][j] * inv % mod;
    for (int j = 0; j <= n; j++) {
      if (i == j) continue;
      int tmp = a[j][i];
      for (int k = i; k <= n + 1; k++) dec(a[j][k], 1ll * tmp * a[i][k] % mod);
    }
  }
  for (int i = 0; i <= n; i++) ans[i] = a[i][n + 1];
}
int make_add(int a, int b) {
  printf("+ %d %d %d\n", a, b, ++tot);
  return tot;
}
int make_mul(int a, int b) {
  int ret = 0;
  while (b) {
    if (b & 1) {
      if (ret)
        ret = make_add(ret, a);
      else
        ret = a;
    }
    a = make_add(a, a), b >>= 1;
  }
  return ret;
}
int make_pw(int x) {
  printf("^ %d %d\n", x, ++tot);
  return tot;
}
int make_sqr(int x) {
  int ret = 0;
  for (int i = 0; i <= n; i++) {
    if (!ans[i]) continue;
    if (i == 0)
      ret = make_mul(make_pw(x), ans[i]);
    else {
      if (ret)
        ret = make_add(ret, make_mul(make_pw(make_add(x, i + 2)), ans[i]));
      else
        ret = make_mul(make_pw(make_add(x, i + 2)), ans[i]);
    }
  }
  return ret;
}
int main() {
  n = gi(), mod = gi();
  for (int i = 0; i <= n; i++) {
    C[i][0] = 1;
    for (int j = 1; j <= i; j++) C[i][j] = add(C[i - 1][j], C[i - 1][j - 1]);
  }
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j <= n; j++) a[i][j] = 1ll * C[n][i] * qpow(j, n - i) % mod;
    if (i == 2) a[i][n + 1] = 1;
  }
  gauss();
  for (int i = 2; i <= n; i++) printf("+ %d %d %d\n", 3, i + 1, i + 2);
  tot = n + 2;
  int x = 1, y = 2, z = make_sqr(make_add(x, y)), ret;
  x = make_mul(make_sqr(x), mod - 1);
  y = make_mul(make_sqr(y), mod - 1);
  ret = make_mul(make_add(make_add(z, x), y), (mod + 1) >> 1);
  printf("f %d\n", ret);
  return 0;
}
