#include using namespace std; const int kMaxM = 50000, kMaxN = 25; int Values[kMaxM][kMaxN]; int SortedValues[kMaxN][kMaxM]; long long PrefixSum[kMaxN][kMaxM]; int main() { #ifdef LOCAL freopen("kittens.in", "r", stdin); freopen("kittens.out", "w", stdout); #endif int n, m; cin >> m >> n; for(int i = 0; i < m; ++i) for(int j = 0; j < n; ++j) { cin >> Values[i][j]; SortedValues[j][i] = Values[i][j]; } for(int i = 0; i < n; ++i) { sort(SortedValues[i], SortedValues[i] + m); PrefixSum[i][0] = SortedValues[i][0]; for(int j = 1; j < m; ++j) PrefixSum[i][j] = PrefixSum[i][j - 1] + SortedValues[i][j]; } vector all; long long best = numeric_limits :: max(); for(int i = 0; i < m; ++i) { long long cost = 0LL; for(int j = 0; j < n; ++j) { int lo = -1, upper = m; while(upper - lo > 1) { int middle = (lo + upper) / 2; if(SortedValues[j][middle] <= Values[i][j]) lo = middle; else upper = middle; } if(lo != -1) { cost += 1LL * (lo + 1) * Values[i][j] - 2 * PrefixSum[j][lo]; } cost += -1LL * (m - lo - 1) * Values[i][j] + PrefixSum[j][m - 1]; } if(cost < best) { all.clear(); best = cost; } if(cost == best) { string curr; for(int j = 0; j < n; ++j) { curr += to_string(Values[i][j]) + " "; } curr.pop_back(); all.push_back(curr); } } cout << best << '\n' << all.size() << '\n'; sort(begin(all), end(all)); for(auto& x: all) cout << x << '\n'; return 0; }