program

#include <bits/stdc++.h>
using namespace std;

// ackの計算(履歴保存)
int ack_calc(vector<vector<int>> &ack_process) {
  int step = ack_process.size() - 1;  // 現在のステップ数を求める
  int depth = ack_process.at(step).size() - 1;  // 再帰の深さ
  if (depth == 0) {
    return ack_process.at(step).at(0);
  } else if (ack_process.at(step).at(depth - 1) == 0) {  // m=0 のとき
    vector<int> add_vector(depth);                       // 履歴は1少ない
    ack_process.push_back(add_vector);
    for (int i = 0; i < depth - 1; i++) {
      ack_process.at(step + 1).at(i) =
          ack_process.at(step).at(i);  // 次の行の一番最後以外は同じ
    }
    ack_process.at(step + 1).at(depth - 1) = ack_process.at(step).at(depth) + 1;
    return ack_calc(ack_process);
  } else if (ack_process.at(step).at(depth) == 0) {  // n = 0 のとき
    vector<int> add_vector(depth + 1);               // 履歴の数は同じ
    ack_process.push_back(add_vector);
    for (int i = 0; i < depth - 1; i++) {
      ack_process.at(step + 1).at(i) =
          ack_process.at(step).at(i);  // 次の行の最後2つ以外は同じ
    }
    ack_process.at(step + 1).at(depth - 1) =
        ack_process.at(step).at(depth - 1) - 1;  // 次はm-1
    ack_process.at(step + 1).at(depth) = 1;      // 一番最後は1
    return ack_calc(ack_process);
  } else {
    vector<int> add_vector(depth + 2);  // 履歴の数は1増える
    ack_process.push_back(add_vector);
    for (int i = 0; i < depth - 1; i++) {
      ack_process.at(step + 1).at(i) =
          ack_process.at(step).at(i);  // 次の行の最後3つ以外は同じ
    }
    ack_process.at(step + 1).at(depth - 1) =
        ack_process.at(step).at(depth - 1) - 1;  // 次はm-1
    ack_process.at(step + 1).at(depth) =
        ack_process.at(step).at(depth - 1);  // その次はm
    ack_process.at(step + 1).at(depth + 1) =
        ack_process.at(step).at(depth) - 1;  // 最後はn - 1
    return ack_calc(ack_process);
  }
}

void print_line(vector<int> &ack_process_l, int depth) {
  if (ack_process_l.size() == depth + 1) {  // 最後
    cout << ack_process_l.at(depth);
  } else {
    cout << "Ack(" << ack_process_l.at(depth) << ", ";
    print_line(ack_process_l, depth + 1); // 1深いところに再帰
    cout << ")";
  }
}

int main() {
  int m, n;
  cin >> m >> n;
  // 過程の格納
  vector<vector<int>> ack_process(1, vector<int>(2, 0));
  ack_process.at(0).at(0) = m;
  ack_process.at(0).at(1) = n;

  cout << ack_calc(ack_process) << endl;

  int steps = ack_process.size();
  for (int i = 0; i < steps; i++)
  {
    if (i != 0) {
      cout << "=";
    }
    print_line(ack_process.at(i), 0);
    cout << endl;
  }
  
  return 0;
}