#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int f[100005],st[3000005],m,k,num,a[100005];
int main()
{
scanf("%d %d",&m,&k);
for(int i=1;i<=m;i++)
{
scanf("%d",&num);
for(int P=1;P<=num;P++)
scanf("%d",&a[P]);
sort(a+1,a+1+num);
int tot=0;
for(int j=1;j<=k&&f[j];j++)
for(int w=1;w<=num;w++)
{
st[++tot]=f[j]+a[w];
}
if(i==1)
{
for(int w=1;w<=num;w++)
f[w]=a[w];
}
sort(st+1,st+1+tot);
if(i!=1)
for(int j=1;j<=k;j++)
f[j]=st[j;
}
cout<<f[k]<<endl;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
long long n,k,a[500008],b[500008],f[11][500008],tot;
long long ans;
priority_queue<long long> qu;
int main(){
scanf("%lld%lld",&n,&k); ans=0;
for(int i=1;i<=n;i++){
scanf("%lld",&f[i][0]);
for(int j=1;j<=f[i][0];j++)
scanf("%lld",&f[i][j]);
sort(f[i]+1,f[i]+1+f[i][0]);
}
tot=min(k,f[1][0]);
for(int i=1;i<=tot;i++) b[i]=f[1][i];
for(int i=2;i<=n;i++){
long long flag=100000000000000;
for(int j=1;j<=f[i][0];j++)
for(int g=1;g<=tot;g++){
if(b[g]+f[i][j]>flag) break;
if(qu.size()<k){
qu.push(b[g]+f[i][j]);
if(qu.size()==k) flag=qu.top();
}else{
if(b[g]+f[i][j]<flag){
qu.pop();
qu.push(b[g]+f[i][j]);
flag=qu.top();
}
}
}
tot=0;
while(!qu.empty()){
b[++tot]=qu.top();
qu.pop();
}
for(int i=1;i<=tot/2;i++){
swap(b[i],b[tot-i+1]);
}
}
printf("%lld",b[k]);
}