(我就把EK转成dinic,结果连20分都不配拥有了awa)
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace io
{
inline int read(){int x=0,w=0;char c=0;while(!isdigit(c))w|=c=='-',c=getchar();while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();return w?-x:x;}
template<typename T>inline void write(T x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');}
template<typename T>inline void write_(T x){write(x),putchar(' ');}
template<typename T>inline void writeln(T x){write(x),putchar('\n');}
}
using namespace io;
const int N=3e6+5;
bool v[N];
int n,m,s,t,S,T,ans,top=1,cnt,dis[N],d[N],h[N],now[N],b[N];
struct node{int nx,to,w,d;}e[N];
void add(int u,int v,int w,int d)
{
e[++top]=(node){h[u],v,w,-d},h[u]=top;
e[++top]=(node){h[v],u,0,d},h[v]=top;
}
inline bool bfs()
{
memset(dis,-100,sizeof dis);//注意,一定要小
memset(v,0,sizeof v);
memset(d,0,sizeof d);
queue<int>q;
q.push(S);
dis[S]=0,v[S]=d[S]=1,now[S]=h[S];
while(!q.empty())
{
int u=q.front();
q.pop();
v[u]=0;
for(int i=h[u];i;i=e[i].nx)
{
int to=e[i].to,w=e[i].w,k=e[i].d;
if(w>0&&dis[to]<dis[u]+k)
{
dis[to]=dis[u]+k;
d[to]=d[u]+1;
now[to]=h[to];
if(!v[to]) q.push(to),v[to]=1;
}
}
}
if(dis[T]<0) return 0;
else return 1;
}
int dfs(int u,int flow)
{
if(u==T) return flow;
for(int i=now[u];i;i=e[i].nx)
{
int to=e[i].to,w=e[i].w,c=e[i].d,k;
if(d[to]!=d[u]+1||!w||dis[to]!=dis[u]+c) continue;
if(!(k=dfs(to,min(flow,w)))) continue;
e[i].w-=k;
e[i^1].w+=k;
ans+=c;
now[u]=i;
return k;
}
return 0;
}
signed main()
{
n=read();
s=0,t=n+1;
S=n+2,T=n+3;
for(int i=1;i<=n;i++)
{
int t=read();
for(int j=1;j<=t;j++)
{
int v=read(),w=read();
++b[v],--b[i];
ans-=w;
add(i,v,INT_MAX,w);
}
}
for(int i=2;i<=n;i++) add(i,t,INT_MAX,0);
add(t,s,INT_MAX,0);
for(int i=1;i<=n+1;i++)
{
if(b[i]>0) add(S,i,b[i],0);
if(b[i]<0) add(i,T,-b[i],0);
}
while(bfs())while(dfs(S,INT_MAX));
write(-ans);
return 0;
}