#include <iostream> #include <iomanip> #include <fstream> #include <string.h> #include <algorithm> #define nMax 50003 #define mMax 30 #define INF 2000000000000000 using namespace std; //ifstream cin("000.in"); //ofstream cout("000.out"); int n, m, nrSol; long long Sol, distMin; int mat[nMax][mMax], newMat[nMax][mMax], v[nMax], height[mMax]; int comp(int a, int b) { for(int i=1; i<=m; i++) { if(mat[a][i]<mat[b][i]) return 1; if(mat[a][i]>mat[b][i]) return 0; } return 0; } int cmp(int a, int b) { return comp(a, b); } long long int abs(long long int val) { if(val<0) return -val; return val; } int main() { cin>>n>>m; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) cin>>mat[i][j]; v[i]=i; } sort(v+1, v+n+1, cmp); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) newMat[i][j]=mat[v[i]][j]; for(int j=1; j<=m; j++) { long long nrDist=0; for(int i=1; i<=n; i++) nrDist+=newMat[i][j]; int rez=nrDist/n; int jos=rez, sus=rez+1; long long potJos=0, potSus=0; for(int i=1; i<=n; i++) { potJos+=abs(newMat[i][j]-jos); potSus+=abs(newMat[i][j]-sus); } if(potJos<=potSus) { Sol+=potJos; height[j]=jos; } else { Sol+=potSus; height[j]=sus; } } cout<<Sol<<'\n'; long long distMin=INF; for(int i=1; i<=n; i++) { long long dist=0; for(int j=1; j<=m; j++) dist+=abs(height[j]-newMat[i][j]); if(dist<distMin) { nrSol=1; distMin=dist; } else if(dist==distMin) nrSol++; } cout<<nrSol<<'\n'; for(int i=1; i<=n; i++) { long long dist=0; for(int j=1; j<=m; j++) dist+=abs(height[j]-newMat[i][j]); if(dist==distMin) { for(int j=1; j<=m; j++) cout<<newMat[i][j]<<" "; cout<<'\n'; } } return 0; }