#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define uint unsigned int
#define ld long double
#define u128 __uint128_t
#define int128 __int128_t
#define fi first
#define se second
#define get_bit(n, k) ((n >> k) & 1LL)
#define on_bit(n, k) (n | (1LL << k))
#define off_bit(n, k) (n & (~(1LL << k)))
#define toggle_bit(n, k) (n ^ (1LL << k))
#define matran vector<vector<ll>>
#define pii pair<int, int>
#define pil pair<int, ll>
#define pli pair<ll, int>
#define pll pair<ll, ll>
using namespace std;
const ll nmax = 3e5 + 5, qmx = 6e6 + 5, LOG = 21, bl = 331, mod = 1e9 + 19972207, ofs = 105;
int n, k;
string s[55];
int a[nmax];
int par[nmax], wall[55], vis[55];
int mark = 1, m = 0;
struct suffarr
{
int sa[nmax], rnk[nmax], tmp[nmax], lcp[nmax], cnt[nmax];
void build(const int a[], int len)
{
int m = 300;
for(int i = 1; i <= m; i++)
{
cnt[i] = 0;
}
for(int i = 1; i <= len; i++)
{
cnt[rnk[i] = a[i]]++;
}
for(int i = 1; i <= m; i++)
{
cnt[i] += cnt[i - 1];
}
for(int i = len; i >= 1; i--)
{
sa[cnt[rnk[i]]--] = i;
}
for(int kst = 1; kst <= len; kst <<= 1)
{
int p = 0;
for(int i = len - kst + 1; i <= len; i++)
{
tmp[++p] = i;
}
for(int i = 1; i <= len; i++)
{
if(sa[i] > kst)
{
tmp[++p] = sa[i] - kst;
}
}
for(int i = 1; i <= m; i++)
{
cnt[i] = 0;
}
for(int i = 1; i <= len; i++)
{
cnt[rnk[tmp[i]]]++;
}
for(int i = 1; i <= m; i++)
{
cnt[i] += cnt[i - 1];
}
for(int i = len; i >= 1; i--)
{
sa[cnt[rnk[tmp[i]]]--] = tmp[i];
}
for(int i = 1; i <= len; i++)
{
tmp[i] = rnk[i];
}
rnk[sa[1]] = 1;
p = 1;
for(int i = 2; i <= len; i++)
{
int pre1 = tmp[sa[i - 1]];
int pre2 = (sa[i - 1] + kst <= len) ? tmp[sa[i - 1] + kst] : 0;
int cur1 = tmp[sa[i]];
int cur2 = (sa[i] + kst <= len) ? tmp[sa[i] + kst] : 0;
if(pre1 == cur1 && pre2 == cur2)
{
rnk[sa[i]] = p;
}
else
{
rnk[sa[i]] = ++p;
}
}
if(p == len)
{
break;
}
m = p;
}
}
void buildlcp(const int a[], int len)
{
int valk = 0;
for(int i = 1; i <= len; i++)
{
if(rnk[i] == 1)
{
lcp[1] = 0;
valk = 0;
continue;
}
int j = sa[rnk[i] - 1];
while(i + valk <= len && j + valk <= len && a[i + valk] == a[j + valk])
{
valk++;
}
lcp[rnk[i]] = valk;
if(valk > 0) valk--;
}
}
} sa;
int check(int len, int &best)
{
int i = 1;
while(i <= m)
{
int j = i;
while(j + 1 <= m && sa.lcp[j + 1] >= len)
{
j++;
}
mark++;
int dist = 0;
int found = -1;
for(int idx = i; idx <= j; idx++)
{
int pos = sa.sa[idx];
int id = par[pos];
if(id > 0 && wall[id] - pos >= len)
{
if(found == -1)
{
found = pos;
}
if(vis[id] != mark)
{
vis[id] = mark;
dist++;
}
}
}
if(dist >= k)
{
best = found;
return 1;
}
i = j + 1;
}
return 0;
}
signed main()
{
if(fopen("thuyvan.inp", "r"))
{
freopen("thuyvan.inp", "r", stdin);
freopen("thuyvan.out", "w", stdout);
}
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin>>n>>k;
m = 0;
int mxlen = 0;
for(int i = 1; i <= n; i++)
{
cin>>s[i];
int len = s[i].size();
if(len > mxlen)
{
mxlen = len;
}
for(int j = 1; j <= len; j++)
{
m++;
a[m] = 100 + (s[i][j - 1] - 'a');
par[m] = i;
}
m++;
a[m] = i;
par[m] = 0;
wall[i] = m;
}
sa.build(a, m);
sa.buildlcp(a, m);
int lo = 1, hi = mxlen;
int anslen = 0, anspos = -1;
while(lo <= hi)
{
int mid = lo + (hi - lo) / 2;
int stpos = -1;
if(check(mid, stpos))
{
anslen = mid;
anspos = stpos;
lo = mid + 1;
}
else
{
hi = mid - 1;
}
}
if(anslen > 0 && anspos != -1)
{
for(int idx = anspos; idx < anspos + anslen; idx++)
{
cout<<(char)('a' + a[idx] - 100);
}
cout<<"\n";
}
}