#include <fstream> #include <iostream> #include <algorithm> #define nMax 50001 #define mMax 26 #define INF 2000000000000000 using namespace std; //ifstream cin("000.in"); int n, m; long long dpUp[nMax], dpDown[nMax], Sol; int mat[nMax][mMax], newMat[nMax][mMax], height[nMax], nrSol, v[nMax]; int abs(int nr) { if(nr<0) return -nr; return nr; } bool cmp(const int &a, const 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 1;; } 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++) { for(int i=1; i<=n; i++) v[i]=newMat[i][j]; sort(v+1, v+n+1); v[0]=v[1], v[n+1]=v[n]; long long nrMom=0; for(int i=1; i<=n; i++) { dpUp[i]=dpUp[i-1]+1ll*(v[i]-v[i-1])*nrMom; nrMom++; } nrMom=0; for(int i=n; i>=1; i--) { dpDown[i]=dpDown[i+1]+1ll*(v[i+1]-v[i])*nrMom; nrMom++; } long long minDist=INF; for(int i=1; i<=n; i++) { if(dpUp[i]+dpDown[i]<minDist) { minDist=dpUp[i]+dpDown[i]; height[j]=v[i]; } } Sol+=minDist; } cout<<Sol<<'\n'; long long Sol=INF; for(int i=1; i<=n; i++) { long long minDist=0; for(int j=1; j<=m; j++) minDist+=abs(newMat[i][j]-height[j]); if(minDist<=Sol) { if(minDist<Sol) { Sol=minDist; nrSol=1; } else nrSol++; } } cout<<nrSol<<'\n'; for(int i=1; i<=n; i++) { long long minDist=0; for(int j=1; j<=m; j++) minDist+=abs(newMat[i][j]-height[j]); if(minDist==Sol) { for(int j=1; j<=m; j++) cout<<newMat[i][j]<<" "; cout<<'\n'; } } }