#include <bits/stdc++.h>
using namespace std;
long long C[2333][2333];
int d, MOD, p = 0;
long long co[23333];
vector<int> operator-(vector<int> a, vector<int> b) {
  vector<int> s;
  int u = max(a.size(), b.size());
  a.resize(u);
  b.resize(u);
  for (int i = 0; i < u; ++i) s.push_back((a[i] - b[i]) % MOD);
  return s;
}
long long qp(long long a, long long b) {
  long long x = 1;
  a %= MOD;
  while (b) {
    if (b & 1) x = x * a % MOD;
    a = a * a % MOD;
    b >>= 1;
  }
  return x;
}
int add(int a, int b) {
  ++p;
  cout << "+ " << a << " " << b << " " << p << endl;
  co[p] = (co[a] + co[b]) % MOD;
  return p;
}
int po(int a) {
  ++p;
  cout << "^ " << a << " " << p << endl;
  co[p] = qp(co[a], d);
  return p;
}
int mul(int a, int k) {
  k = (k % MOD + MOD) % MOD;
  if (!k) k += MOD;
  int s = a;
  --k;
  while (k) {
    if (k & 1) s = add(s, a);
    a = add(a, a);
    k >>= 1;
  }
  return s;
}
int neg(int a) { return mul(a, MOD - 1); }
int minus_(int a, int b) { return add(a, neg(b)); }
void op(int a) {
  cout << "f " << a << endl;
  cerr << co[a] << endl;
}
int l = 3, z;
long long show(vector<int>& v, long long t) {
  long long x = 1, s = 0;
  for (int i = 0; i < v.size(); ++i)
    s += x * v[i] % MOD, s %= MOD, x = x * t % MOD;
  return (s % MOD + MOD) % MOD;
}
int p2(int a) {
  if (d == 2) return po(a);
  int n = d + 1;
  static vector<int> u[233], ss[233];
  static int w[233], ww[233];
  ww[0] = a;
  for (int i = 1; i <= n; ++i) {
    u[i].clear();
    ss[i].clear();
    for (int w = 0; w <= d; ++w) u[i].push_back(C[d][w] * qp(i, d - w) % MOD);
    ww[i] = add(ww[i - 1], l);
    w[i] = po(ww[i]);
    ss[i].resize(n + 1);
    ss[i][i] = 1;
  }
  for (int s = 0; s <= d; ++s) {
    long long x = u[s + 1][s] % MOD;
    if (!x) {
      for (int q = s + 2; q <= n; ++q)
        if (u[q][s] % MOD) {
          x = u[q][s] % MOD;
          for (int i = 1; i <= n; ++i) swap(ss[i][s + 1], ss[i][q]);
          swap(u[s + 1], u[q]);
          break;
        }
    }
    if (!x) throw "GG";
    long long rv = qp(x, MOD - 2);
    for (auto& w : u[s + 1]) w = w % MOD * rv % MOD;
    for (auto& w : ss[s + 1]) w = w % MOD * rv % MOD;
    for (int q = 1; q <= n; ++q)
      if (q != s + 1 && u[q][s] % MOD) {
        long long v = u[q][s] % MOD;
        for (int e = 1; e <= n; ++e)
          ss[q][e] = (ss[q][e] - ss[s + 1][e] * v) % MOD;
        for (int e = 0; e <= d; ++e)
          u[q][e] = (u[q][e] - u[s + 1][e] * v) % MOD;
      }
  }
  int aa = z;
  for (int i = 1; i <= n; ++i)
    if (ss[3][i]) aa = add(aa, mul(w[i], ss[3][i]));
  return aa;
}
int main() {
  cin >> d >> MOD;
  p = 4;
  for (int i = 0; i < 23333; ++i) co[i] = 1;
  for (int i = 0; i < 2333; ++i) {
    C[i][0] = 1;
    for (int j = 1; j <= i; ++j)
      C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;
  }
  co[1] = 5;
  co[2] = 3;
  z = minus_(l, l);
  op(mul(minus_(minus_(p2(add(1, 2)), p2(1)), p2(2)), (MOD + 1) / 2));
}
