#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <sstream>
#include <iomanip>
using namespace std;
typedef unsigned long long ULL;
ULL cnt[10000],pre[10000],check[110][210],calc[26],K,canuse[26],oo = (ULL)1<<60;
void add(ULL &a,ULL b){
	if (a>=oo||b>=oo||a+b>=oo) {
		a = oo;
		return ;
	}
	a = a+b;
}
ULL mul(ULL a,ULL b){

	//if (log(a)+log(b)>=log(oo)) return oo;
	if ((double)a*b>=oo) return oo;
	return a*b;
}
char str[110][210],finalans[10000];
int main(){
	int N,M,i,j,k,c;
	while(scanf("%d%d",&N,&M)!=EOF){
		cin>>K;
		for (i=0;i<N;i++)
			scanf("%s",str[i]);
		memset(cnt,0,sizeof(cnt));
		memset(pre,0,sizeof(pre));
		for (i=0;i<=M;i++)
			if (i==0) cnt[i] = 1;
			else {
				for (j=0;j<N;j++)
				if (i>=strlen(str[j]))
					add(cnt[i],cnt[i-strlen(str[j])]);
			}
		if (cnt[M]<K) {
			printf("-\n");
			continue;
		}
		for (i=0;i<N;i++)
			check[i][0] = strlen(str[i])<=M;
		pre[0] = 1;
		for (i=0;i<M;i++){
			memset(calc,0,sizeof(calc));
			for (j=0;j<N;j++)
				for (k=0;k<strlen(str[j]);k++)
					if (check[j][k]){
						int c = str[j][k]-'a';
						//canuse[c] = 1;
						add(calc[c], mul(pre[i-k],cnt[M-i-(strlen(str[j])-k)]));
					}
			for (c=0;c<26;c++){
				//printf("%d %lld--\n",c,calc[c]);
				if (calc[c]>=K){
					finalans[i] = c+'a';
				//	printf("%d %c\n",i,finalans[i]);
					for (j=0;j<N;j++){
						bool aha = 0;
						for (k=strlen(str[j])-1;k>=0;k--)
							if (check[j][k]){
								if (str[j][k]==c+'a'){
									check[j][k+1] = true;
									if (k+1==strlen(str[j]))
										{
										add(pre[i+1],pre[i+1-strlen(str[j])]);
										aha = 1;
										}
								}
								check[j][k] = 0;
							}

							check[j][0] = i+1+strlen(str[j])<=M;
					}
					break;

				}
				K-=calc[c];
			}

		}
		finalans[M] = 0;

		printf("%s\n",finalans);
	}
}



