#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();
};