OI XXVIII - cuk

// https://szkopul.edu.pl/problemset/problem/rr3lU0T8pNn2mAbL07wBTZT3/site/?key=statement

#include <bits/stdc++.h>

using namespace std;

#define int long long

constexpr int sizik = 3 * 100 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef vec<vec<int>> _kra;

constexpr int INF = INT64_MAX;
int r[sizik], d[sizik], p[sizik];
int isNonZero[sizik];
int n;
int m[sizik];

void brut() {
    int ans = INF;
    for (int i = isNonZero[0]; i <= n; i++) {
        for (int j = isNonZero[1]; j <= n; j++) {
            for (int k = isNonZero[2]; k <= n; k++) {
                if ((i == j) || (i == k) || (j == k)) continue;
                int local_ans = 0;
                for (int z = 1; z <= n; z++) {
                    if (z == i) {
                        local_ans += d[z] + p[z];
                    } else if (z == j) {
                        local_ans += r[z] + p[z];
                    } else if (z == k) {
                        local_ans += r[z] + d[z];
                    } else {
                        local_ans += std::min({d[z] + p[z], r[z] + p[z], r[z] + d[z]});
                    }
                }
                ans = std::min(ans, local_ans);
            }
        }
    }
    std::cout << ans << '\n';
}

int cq = 0;

void wzor() {
    std::vector<std::pair<int, int>> u1, u2, u3;
    for (int i = 1; i <= n; i++) {
        u1.push_back({m[i] - r[i], i});
        u2.push_back({m[i] - d[i], i});
        u3.push_back({m[i] - p[i], i});
    }

    std::sort(u1.begin(), u1.end());
    std::sort(u2.begin(), u2.end());
    std::sort(u3.begin(), u3.end());

    int ans = INF;

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 3; k++) {
                if (isNonZero[0] == 0) {
                    u1[i].second = 0;
                    u1[i].first = 0;
                }
                if (isNonZero[1] == 0) {
                    u2[j].second = 0;
                    u2[j].first = 0;
                }
                if (isNonZero[2] == 0) {
                    u3[k].second = 0;
                    u3[k].first = 0;
                }
                if ((u1[i].second == u2[j].second && u1[i].second != 0) || (u3[k].second == u2[j].second && u2[j].second != 0) ||
                    (u1[i].second == u3[k].second && u1[i].second != 0))
                    continue;
                ans = std::min(ans, cq + u1[i].first + u2[j].first + u3[k].first);
            }
        }
    }

    std::cout << ans << '\n';
}

void solve() {
    std::cin >> n;

    for (int i = 1; i <= n; i++) {
        std::cin >> r[i] >> d[i] >> p[i];
        m[i] = std::max({r[i], p[i], d[i]});
        cq += r[i] + d[i] + p[i] - m[i];
        if (r[i] != 0) isNonZero[0] = 1;
        if (d[i] != 0) isNonZero[1] = 1;
        if (p[i] != 0) isNonZero[2] = 1;
    }

    if (n <= 5) {
        brut();

        return;
    }

    wzor();
}

int32_t main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}