#include<bits/stdc++.h>
using namespace std;
#define tm SBZYMXXS
#define int long long
#define inf 0x3f3f3f3f
const int N=1e6+5;
int n,m,k,s,t;
int f[100],wei[100],tm[100];
vector<int> sp[100];
int cnt=1,h[N],d[N],now[N];
struct Edge{
int v,w,nxt;
}e[N];
void add(int u,int v,int w){e[++cnt] = (Edge) { v, w, h[u] }; h[u] = cnt;}
void addd(int u,int v,int w){add(u,v,w);add(v,u,0);}
bool v[N];
int maxflow,ret;
int find(int x){
if(x!=f[x])f[x]=find(f[x]);
return f[x];
}
void uni(int x,int y){
int k=find(x),l=find(y);
if(k!=l) f[k]=l;
}
bool bfs(){
memset(d,0,sizeof d);
d[s]=1;
queue<int> q;
q.push(s);
now[s]=h[s];
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=h[x],y;i;i=e[i].nxt){
if(e[i].w&&!d[y=e[i].v]){
now[y]=h[y];
d[y]=d[x]+1;
q.push(y);
if(y==t)return 1;
}
}
}
return 0;
}
int dinic(int x,int flow){
if(x==t)return flow;
int ret=flow;
for(int i=now[x],y;i&&ret;i=e[i].nxt){
now[x]=i;
if(e[i].w&&d[y=e[i].v]==d[x]+1){
int t=dinic(y,min(e[i].w,ret));
if(!t)d[y]=0;
ret-=t;
e[i].w-=t;
e[i^1].w+=t;
}
}
return flow-ret;
}
int Dinic(){
maxflow=ret=0;
while(bfs())while(ret=dinic(s,inf))maxflow+=ret;
return maxflow;
}
signed main(){
cin>>n>>m>>k;
s=0,t=10000;
int rs=0;
for(int i=1;i<=m;i++){
cin>>wei[i]>>tm[i];
for(int j=0;j<tm[i];j++){
int v;
cin>>v;
if(v==0)v=n+1;
if(v==-1)v=n+2;
sp[i].push_back(v);
if(j>0) uni(sp[i][j-1],sp[i][j]);
}
}
if(find(n+1)!=find(n+2)) {puts("0");return 0;}
for(int ans=1;;ans++){
addd(s,ans*(n+1),inf);
addd(ans*(n+2),t,inf);
for(int i=1;i<=m;i++){
int x=(ans-1)%tm[i],y=ans%tm[i];
if(sp[i][x]==n+2) x=t;
else x=(ans-1)*(n+1)+sp[i][x];
if(sp[i][y]==n+2) y=t;
else y=ans*(n+1)+sp[i][y];
addd(x,y,wei[i]);
rs+=Dinic();
if(rs>=k){
cout<<ans;
return 0;
}
for(int i=1;i<=n+1;++i) add((ans-1)*(n+1)+i,ans*(n+1)+i,inf);
}
}
return 0;
}