#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int mod=1019260817, mul=19260817;
int n, k, len[2005], r=1;
bool dp[2005][10005], pre[10005]={1}, id[10005]={0, 1}, newid[10005];
char ans[10005], s[2005][10005];
vector<long long>v[2005], v1[2005];
long long ksm[10005]={1}, h[10005], h1[10005], ksm1[10005]={1};
void calc()
{
for(int i=r; i<=k; i++)
ans[i]=127;
long long x=0, y=0;
for(int i=1; i<=k; i++)
{
x=x*mul%mod;
x+=ans[i]-'a';
y=y*mul;
y+=ans[i]-'a';
h[i]=x;
h1[i]=y;
}
}
int main()
{
scanf("%d%d", &n, &k);
for(int i=1; i<=n; i++)
scanf("%s", s[i]);
for(int i=1; i<=n; i++)
len[i]=strlen(s[i]);
for(int i=n; i; i--)
{
for(int j=0; j+len[i]<=k; j++)
dp[i][j+len[i]]|=pre[j];
for(int j=len[i]; j<=k; j++)
pre[j]|=dp[i][j];
}
memset(pre, 0, sizeof(pre));
for(int i=1; i<=n; i++)
{
for(int j=len[i]; j<k; j++)
if(dp[i][j])
{
if(!pre[j])
dp[i][j]=0;
else
pre[j-len[i]]=1;
}
if(dp[i][k])
pre[k-len[i]]=1;
}
for(int i=1; i<=n; i++)
{
long long x=0, y=0;
for(int j=0; j<len[i]; j++)
{
x=x*mul%mod;
x+=s[i][j]-'a';
y=y*mul;
y+=s[i][j]-'a';
v[i].push_back(x);
v1[i].push_back(y);
}
}
for(int i=1; i<=k; i++)
ksm[i]=ksm[i-1]*mul%mod;
for(int i=1; i<=k; i++)
ksm1[i]=ksm1[i-1]*mul;
calc();
for(int i=1; i<=n; i++)
{
for(int j=1; j<=k; j++)
if(id[j]&&dp[i][k+1-j])
{
int x=-1;
for(int l=20; ~l; l--)
if(x+(1<<l)<len[i]&&j+x+(1<<l)<=k)
if(v[i][x+(1<<l)]==((h[j+x+(1<<l)]-ksm[x+(1<<l)+1]*h[j-1])%mod+mod)%mod)
if(v1[i][x+(1<<l)]==h1[j+x+(1<<l)]-ksm1[x+(1<<l)+1]*h1[j-1])
x+=1<<l;
if(x==len[i]-1)
newid[j+len[i]]=1;
else if(s[i][x+1]<ans[j+x+1])
{
for(int l=0; l<len[i]; l++)
ans[j+l]=s[i][l];
r=j+len[i];
for(int l=x+2; l<len[i]; l++)
id[l+j]=newid[l+j]=0;
id[r]=1;
for(int l=r+1; l<=k; l++)
id[l]=newid[l]=0;
break;
}
}
for(int j=1; j<=k; j++)
id[j]|=newid[j];
memset(newid, 0, sizeof(newid));
calc();
}
for(int i=1; i<=k; i++)
putchar(ans[i]);
}