#include <set> #include <string> #include <vector> #include <iostream> #include <algorithm> using namespace std; const int lim = 100; int main() { int N, K; cin >> N >> K; vector<int> A(N); for (int i = 0; i < N; ++i) { cin >> A[i]; } vector<int> cnt(lim); for (int i = 0; i < N; ++i) { ++cnt[A[i]]; } vector<vector<int> > g; g.push_back(vector<int>()); vector<int> cur; for (int i = lim - 1; i >= 10; --i) { if (i % 11 != 0 || cnt[i / 11] == 0) { for (int j = 0; j < cnt[i]; ++j) { cur.push_back(i); g.push_back(cur); } } else { for (int j = 0; j < cnt[i]; ++j) { cur.push_back(i / 11); g.push_back(cur); cur.pop_back(); cur.push_back(i); g.push_back(cur); } for (int j = 0; j < cnt[i / 11]; ++j) { cur.push_back(i / 11); g.push_back(cur); } } } reverse(g.begin(), g.end()); vector<string> ans; for (vector<int> v : g) { vector<int> rc = cnt; for (int i : v) { --rc[i]; } vector<int> arr; for (int i = 0; i < lim; ++i) { for (int j = 0; j < rc[i]; ++j) { arr.push_back(i); } } set<string> st; do { string s; for (int i : arr) { s += to_string(i); } st.insert(s); } while (next_permutation(arr.begin(), arr.end())); if (st.size() >= K) { string prefix; for (int i : v) { prefix += to_string(i); } vector<string> w(st.begin(), st.end()); reverse(w.begin(), w.end()); for (int i = 0; i < K; ++i) { ans.push_back(prefix + w[i]); } break; } } for (string s : ans) { cout << s << '\n'; } return 0; }