#include using namespace std; #include using namespace atcoder; using ll = int64_t; using ul = uint64_t; using ld = long double; using vi = vector; using vd = vector; using vc = vector; using vs = vector; using vb = vector; using vl = vector; using vul = vector
    ; using pii = pair; using pll = pair; using vvi = vector; using vvd = vector; using vvc = vector; using vvb = vector; using vvl = vector; using mint = modint998244353; using vm = vector; template struct Trie { // 各頂点の情報を持つ型 struct Node { vi next, end; int c, comm = 0; Node(int c_) : c(c_) { next.assign(char_siz, -1); } }; // tree vector data; int cnt; Trie() : cnt(1) { data.push_back(Node(0)); } // insert void insert(string &S, int id) { int now = 0, siz = S.size(); for (int i = 0; i < siz; i++) { data[now].comm++; int c = S[i] - base; if (data[now].next[c] == -1) { data[now].next[c] = cnt; data.push_back(Node(c)); cnt++; } now = data[now].next[c]; } data[now].end.push_back(id); data[now].comm++; return; } bool search(int rem, stack &hist, int now) { if (data[now].comm <= rem && hist.size() > 0) { string ans = ""; while(!hist.empty()) { ans += hist.top(); hist.pop(); } reverse(ans.begin(),ans.end()); cout << "Yes" << endl << ans << endl; return true; } rem -= data[now].end.size(); if (rem <= 0) return false; for (int i = 0; i < char_siz; i++) { hist.push(base + i); if (search(rem, hist, data[now].next[i])) return true; hist.pop(); } return false; } }; int main() { int N,M; cin >> N >> M; Trie<26, 'a'> trie; for (int i = 0; i < N; i++) { string S; cin >> S; trie.insert(S, i); } stack hist; if (!trie.search(N - M, hist, 0)) cout << "No" << endl; return 0; }