import static java.lang.Math.*; import static java.util.Arrays.*; import java.util.*; public class Main { Scanner sc = new Scanner(System.in); long INF = 1L << 61; long add(long a, long b) { return a + b < INF ? (a + b) : INF; } long mul(long a, long b) { return (double)a * b < INF ? (a * b) : INF; } // O(nmw) void solve() { int n = sc.nextInt(), m = sc.nextInt(); long K = sc.nextLong(); char[][] words = new char[n][]; for (int i = 0; i < n; i++) words[i] = sc.next().toCharArray(); long[] count = new long[m + 1]; count[0] = 1; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { int i2 = i + words[j].length; if (i2 <= m) count[i2] = add(count[i2], count[i]); } } if (count[m] < K) { System.out.println("-"); return; } char[] res = new char[m]; long[] num = new long[m + 1]; num[0] = 1; boolean[][] ok = new boolean[n][]; for (int i = 0; i < n; i++) { ok[i] = new boolean[words[i].length]; ok[i][0] = words[i].length <= m; } for (int i = 0; i < m; i++) { long[] next = new long[26]; for (int j = 0; j < n; j++) { for (int k = 0; k < words[j].length; k++) if (ok[j][k]) { int c = words[j][k] - 'a'; next[c] = add(next[c], mul(num[i - k], count[m - i + k - words[j].length])); } } for (int c = 0; c < 26; c++) { if (K <= next[c]) { res[i] = (char)('a' + c); for (int j = 0; j < n; j++) { for (int k = words[j].length - 1; k >= 0; k--) if (ok[j][k]) { if (words[j][k] == 'a' + c) { if (k + 1 == words[j].length) num[i + 1] = add(num[i + 1], num[i - k]); else ok[j][k + 1] = true; } ok[j][k] = false; } ok[j][0] = i + 1 + words[j].length <= m; } break; } K -= next[c]; } } System.out.println(String.valueOf(res)); } void run() { while (sc.hasNext()) solve(); } void debug(Object...os) { System.err.println(deepToString(os)); } public static void main(String[] args) { new Main().run(); } }