#include <bits/stdc++.h>
using namespace std;
int p, d;
long long ksm(long long a, int b, int c = 1) {
  for (; b; b /= 2, a = a * a % p)
    if (b & 1) c = c * a % p;
  return c;
}
int a[100][100];
int cnt, c[100][100];
struct node {
  int id;
  node(int id = 0) : id(id) {}
  void print() { cout << "f " << id << endl; }
  node operator+(const node& a) const {
    node c(++cnt);
    cout << "+ " << id << " " << a.id << " " << cnt << endl;
    return c;
  }
  void operator+=(const node& a) {
    cout << "+ " << id << " " << a.id << " " << id << endl;
  }
  node operator*(int a) {
    node c(++cnt);
    node d = *this + *this;
    node e = *this + *this;
    a -= 2;
    a = (a % p + p) % p;
    if (a & 1) a += p;
    a /= 2;
    for (; a; a /= 2, d += d)
      if (a & 1) e += d;
    return e;
  }
  node pw() {
    node x(++cnt);
    cout << "^ " << id << " " << cnt << endl;
    return x;
  }
  node sqr() {
    memset(a, 0, sizeof a);
    for (int i = 0; i <= d; i++) {
      for (int j = 0; j <= d; j++) a[i][j] = ksm(j, d - i, c[d][i]);
      if (i == 2)
        a[i][d + 1] = 1;
      else
        a[i][d + 1] = 0;
    }
    for (int i = 0; i <= d; i++) {
      int t = i;
      for (int j = i + 1; j <= d; j++)
        if (a[j][i] > a[t][i]) t = j;
      for (int j = i; j <= d + 1; j++) swap(a[i][j], a[t][j]);
      int s = ksm(a[i][i], p - 2);
      for (int j = i; j <= d + 1; j++) a[i][j] = (long long)a[i][j] * s % p;
      for (int j = 0; j <= d; j++)
        if (j != i)
          for (int k = d + 1; k >= i; k--)
            a[j][k] = (a[j][k] - (long long)a[j][i] * a[i][k] % p + p) % p;
    }
    node x(++cnt);
    node y(++cnt);
    node z = pw() * a[0][d + 1];
    for (int i = 1; i <= d; i++) {
      z += (*this + y).pw() * a[i][d + 1];
      y += x;
    }
    return z;
  }
} x, y;
int main() {
  cin >> d >> p;
  cnt = 2;
  c[0][0] = 1;
  for (int i = 1; i <= d; i++) {
    c[i][0] = 1;
    for (int j = 1; j <= i; j++) c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % p;
  }
  x.id = 1;
  y.id = 2;
  node z = x + y;
  node u = z.sqr() + (x.sqr() * (p - 1)) + (y.sqr() * (p - 1));
  u = u * ((p + 1) / 2);
  u.print();
  return 0;
}
