int tol,head[maxn];
struct edge
{
int to,next,cap,flow,cost;
}es[maxm];
void addedge( int u , int v , int cap , int cost )
{
es[tol].to = v;
es[tol].cap = cap;
es[tol].cost = cost;
es[tol].flow = 0;
es[tol].next = head[u];
head[u] = tol++;
es[tol].to = u;
es[tol].cap = 0;
es[tol].cost = -cost;
es[tol].flow = 0;
es[tol].next = head[v];
head[v] = tol++;
}
int cur[maxn],dis[maxn],ss,tt,N; bool vis[maxn];
int aug( int u , int flow )
{
if ( u==tt ) return flow;
vis[u] = true;
for ( int i=cur[u] ; i!=-1 ; i=es[i].next )
{
int v = es[i].to;
if ( es[i].cap>es[i].flow&&!vis[v]&&dis[u]==dis[v]+es[i].cost )
{
int tmp = aug( v , Min( flow , es[i].cap-es[i].flow ) );
es[i].flow += tmp;
es[i^1].flow -= tmp;
cur[u] = i;
if ( tmp ) return tmp;
}
}
return 0;
}
bool modify_label()
{
int d = inf;
for ( int u=0 ; u<N ; u++ )
if ( vis[u] )
{
for ( int i=head[u] ; i!=-1 ; i=es[i].next )
{
int v = es[i].to;
if ( es[i].cap>es[i].flow&&!vis[v] )
d = Min( d , dis[v]+es[i].cost-dis[u] );
}
}
if ( d==inf ) return false;
for ( int i=0 ; i<N ; i++ )
if ( vis[i] )
{
vis[i] = false;
dis[i] += d;
}
return true;
}
void zkw_MCMF()
{
int flow = 0;
int cost = 0;
for ( int i=0 ; i<N ; i++ ) dis[i] = 0;
while ( 1 )
{
for ( int i=0 ; i<N ; i++ ) cur[i] = head[i];
while ( 1 )
{
for ( int i=0 ; i<N ; i++ ) vis[i] = false;
int tmp = aug( ss , inf );
if ( tmp==0 ) break;
flow += tmp;
cost += tmp*dis[ss];
}
if ( !modify_label() ) break;
}
printf ( "%d\n" , cost );
}