#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
using namespace std;

// 计算最小乘法量的函数
pair<string, int> matrixChainOrder(const vector<pair<int, int>>& matrices) {
    int n = matrices.size();

    // 创建一个二维数组来存储最小乘法量
    vector<vector<int>> cost(n, vector<int>(n, 0));

    // 创建一个二维数组来存储最优括号位置
    vector<vector<string>> brackets(n, vector<string>(n, ""));

    // 初始化cost和brackets数组
    for (int len = 2; len < n; len++) {
        for (int i = 0; i < n - len + 1; i++) {
            int j = i + len - 1;
            cost[i][j] = INT_MAX;

            for (int k = i; k < j; k++) {
                int q = cost[i][k] + cost[k + 1][j] + matrices[i].first * matrices[k].second * matrices[j].second;
                if (q < cost[i][j]) {
                    cost[i][j] = q;
                    brackets[i][j] = "(" + brackets[i][k] + brackets[k + 1][j] + ")";
                }
            }
        }
    }

    // 返回最小乘法量和最优括号位置
    return {brackets[0][n - 1], cost[0][n - 1]};
}

int main() {
    int n;
    cin >> n;

    vector<pair<int, int>> matrices(n);
    for (int i = 0; i < n; i++) {
        cin >> matrices[i].first >> matrices[i].second;
        cout << matrices[i].first << " than " << matrices[i].second << endl;
    }

    pair<string, int> result = matrixChainOrder(matrices);

    cout << result.first << endl;
    cout << result.second << endl;

    return 0;
}
