#include <bits/stdc++.h>
using namespace std;
 
#define TASK "SIRLOCKHOME"
#define all(x) (x).begin(), (x).end()
 
typedef long long ll;
typedef pair<int, int> ii;
 
const int MAX_M = 400;
const int MAX_N = 70;
const int MOD = (int)1e9 + 7;
 
template <class X, class Y>
bool maximize(X& x, const Y& y) {
    if (x >= y) return false;
    x = y;
    return true;
};
template <class X, class Y>
bool minimize(X& x, const Y& y) {
    if (x <= y) return false;
    x = y;
    return true;
};
 
int m, n;
string a[MAX_M + 5];
 
bool cmp(const string& a, const string& b) {
    int i = 0, j = 0;
    while (i + 1 < a.size() && a[i] == '0') i++;
    while (j + 1 < b.size() && b[j] == '0') j++;
 
    int szA = (int)a.size() - i;
    int szB = (int)b.size() - j;
    if (szA < szB) return true;
    if (szA > szB) return false;
 
    for (int k = 0; k < szA; k++) {
        if (a[i + k] < b[i + k]) return true;
        if (a[i + k] > b[i + k]) return false;
    };
 
    return false;
};
 
namespace SUBTASK_12 {
    const int M = MAX_M;
    const int V = 1e5;
    const int INF = 1e9;
 
    int dp[M + 5][V + 5];
 
    int cost(string x, string y) {
        string pad = "";
        int diff = abs((int)x.size() - (int)y.size());
 
        for (int i = 0; i < diff; i++) pad += '0';
        if (x.size() < y.size())
            x = pad + x;
        else
            y = pad + y;
 
        int res = 0;
        for (int i = 0; i < x.size(); i++) {
            if (x[i] != y[i]) res++;
        };
 
        return res;
    };
 
    string addPad(int num) {
        string ret = to_string(num);
        int diff = n - (int)ret.size();
        string pad = "";
        for (int i = 0; i < diff; i++) pad += '0';
        return (pad + ret);
    };
 
    void Trace(int idx, int cur) {
        if (idx == 1) {
            cout << addPad(cur) << '\n';
            return;
        };
 
        int c = cost(to_string(cur), a[idx]);
        for (int val = cur - 1; val >= 0; val--) {
            if (dp[idx - 1][val] + c == dp[idx][cur]) {
                Trace(idx - 1, val);
                cout << addPad(cur) << '\n';
                return;
            };
        };
    };
 
    void Solve() {
        int maxVal = 1;
        for (int i = 1; i <= n; i++) maxVal *= 10;
        maxVal--;
 
        for (int i = 0; i <= m; i++) {
            for (int j = 0; j <= maxVal; j++) {
                dp[i][j] = INF;
            };
        };
 
        for (int cur = 0; cur <= maxVal; cur++) {
            dp[1][cur] = cost(to_string(cur), a[1]);
        };
 
        for (int i = 2; i <= m; i++) {
            int minDp = INF;
            for (int cur = 1; cur <= maxVal; cur++) {
                minimize(minDp, dp[i - 1][cur - 1]);
                dp[i][cur] = minDp + cost(to_string(cur), a[i]);
            };
        };
 
        int res = INF;
        int lastVal = maxVal;
        for (int i = 0; i <= maxVal; i++)
            if (minimize(res, dp[m][i])) lastVal = i;
 
        cout << res << '\n';
 
        Trace(m, lastVal);
    };
};  // namespace SUBTASK_12
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if (fopen(TASK ".INP", "r")) {
        freopen(TASK ".INP", "r", stdin);
        freopen(TASK ".OUT", "w", stdout);
    };
 
    cin >> m >> n;
    for (int i = 1; i <= m; i++) {
        cin >> a[i];
    };
 
    SUBTASK_12::Solve();
};