#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int inf=1e9;
int n,m,k,s,t,head[200005],nxt[200005],edge[200005],to[200005],level[205];
int tot,fa[205],pay[205],num[205],way[55][55];
void add(int u,int v,int w){
to[++tot]=v;
edge[tot]=w;
nxt[tot]=head[u];
head[u]=tot;
to[++tot]=u;
edge[tot]=0;
nxt[tot]=head[v];
head[v]=tot;
}
inline bool bfs(){
memset(level,0,sizeof(level));
queue<int>q;
level[s]=1;
q.push(s);
while(!q.empty()){
int cur=q.front();
q.pop();
for(int i=head[cur];i;i=nxt[i]){
if(edge[i]&&!level[to[i]]){
q.push(to[i]);
level[to[i]]=level[cur]+1;
if(to[i]==t)return 1;
}
}
}
return 0;
}
int Dinic(int x,int flow){
if(x==t)return flow;
int rest=flow,increase;
for(int i=head[x];i&&rest;i=nxt[i]){
int y=to[i];
if(edge[i]&&level[y]==level[x]+1){
increase=Dinic(y,min(rest,edge[i]));
if(!increase)level[y]=0;
edge[i]-=increase;
edge[i^1]+=increase;
rest-=increase;
}
}
return flow-rest;
}
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
void unionn(int x,int y){
int a=find(x),b=find(y);
if(a!=b){
fa[a]=b;
}
return;
}
signed main(){
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
cin>>n>>m>>k;
tot=1;
t=1000003;
for(int i=1;i<=n;++i)fa[i]=i;
for(int i=1;i<=m;++i){
cin>>pay[i]>>num[i];
for(int j=0;j<num[i];++j){
cin>>way[i][j];
if(way[i][j]==-1)way[i][j]=n+2;
if(way[i][j]==0)way[i][j]=n+1;
if(j!=0)unionn(way[i][j-1],way[i][j]);
}
// way[i][num[i]+1]=way[i][1];
}
if(find(n+1)!=find(n+2)){
cout<<0;
return 0;
}
s=0;
for(int ans=1;;++ans){
add(s,(ans-1)*(n+1)+n+1,inf);
//for(int i=1;i<=n+1;++i)add(i,i+(ans-1)*(n+2),inf);
// if(ans!=1)
for(int i=1;i<=m;++i){
int u=(ans-1)%num[i];
int v=(ans)%num[i];
if(way[i][u]==n+2)u=t;
else u=(ans-1)*(n+1)+way[i][u];
if(way[i][v]==n+2)v=t;
else v=(ans)*(n+1)+way[i][v];
add(u,v,pay[i]);
}
int maxflow=0;
while(bfs())maxflow+=Dinic(s,inf);
if(maxflow>=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;
}
样例RE,应该不是数组问题,初步判断RE在add函数但不知道为什么