#include <iostream>
#include <vector>
#include <unordered_map>
#define M_MAX 50010
#define ULL unsigned long long
#define MAX_ULL -1
#include <algorithm>
using namespace std;

int m,n;
unsigned long long sum;
int el;
vector<int> friends[M_MAX];
vector<int> poz;
vector<int> poz2;
int f(vector<int> a,vector<int> b){
    int nr1 = 0;
    int nr2 = 0;
    for(int i=0;i<a.size();i++){
        nr1 += a[i];
        nr2 += b[i];
    }
    return nr1 < nr2;
}

int abs(int a){
    if(a < 0)
        return -a;
    return a;
}

int computeDist(vector<int> a,vector<int> b){
    int nr = 0;
    for(int i=0;i<a.size();i++){
        nr += abs(a[i] - b[i]);
    }
    return nr;
}

int f2(int i,int j){
    for(int p=0;p<n;p++){
        if(friends[i][p] != friends[j][p])
            return friends[i][p] < friends[j][p];
    }
    return 0;
}

void compute(){
    vector<int> mid = friends[m/2];
    vector<int> mid2 = friends[m/2-1];
    ULL total = 0;
    ULL total2 = 0;
    ULL minim2 = MAX_ULL;
    ULL minim = MAX_ULL;
    ULL curent;
    ULL curent2;
    for(int i=0;i<m;i++){
        curent = computeDist(mid,friends[i]);

        if(curent < minim && i!= m/2){
            minim = curent;
            poz.clear();
            poz.push_back(i);
        }

        else if(curent == minim)
            poz.push_back(i);
        total += curent;
    }
    if(n % 2 == 0){
        for(int i=0;i<m;i++){
        curent2 = computeDist(mid2,friends[i]);

        if(curent2 < minim2 && i!= m/2-1){
            minim2 = curent2;
            poz2.clear();
            poz2.push_back(i);
        }

        else if(curent2 == minim2)
            poz2.push_back(i);
        total2 += curent2;
    }
    }
    if(total < total2)
    {
        if(poz.size() == 1 || computeDist(mid,friends[poz[0]]) == computeDist(friends[poz[0]],friends[poz[1]]))
        poz.push_back(m/2);
        cout << total << '\n';
        cout << poz.size() << '\n';
        sort(poz.begin(),poz.end(),f2);
        for(int i=0;i<poz.size();i++){
            for(int j=0;j<n;j++){
                cout << friends[i][j] << ' ';
            }
            cout << '\n';
        }
    }

    else{
        if(poz2.size() == 1 || computeDist(mid2,friends[poz[0]]) == computeDist(friends[poz[0]],friends[poz[1]]))
            poz2.push_back(m/2);
        cout << total2 << '\n';
        cout << poz2.size() << '\n';
        sort(poz2.begin(),poz2.end(),f2);
        for(int i=0;i<poz2.size();i++){
            for(int j=0;j<n;j++){
                cout << friends[i][j] << ' ';
            }
            cout << '\n';
        }

    }

}

int main()
{
    cin >> m >> n;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            cin >> el;
            friends[i].push_back(el);
        }
    }
    sort(friends,friends+m,f);
    compute();
    return 0;
}