#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
struct stk
{
int s[maxn];
int top=0;
void push(int x)
{
s[++top]=x;
}
int pop()
{
return s[top--];
}
void clear()
{
while(top)pop();
}
bool empty()
{
if(top)return false;
return true;
}
};//stack
//======================
struct edge
{
int to,next,w;
}g[maxn];
int head[maxn],cnt=0;
void addedge(int u,int v,int w)
{
g[++cnt].to=v;
g[cnt].w=w;
g[cnt].next=head[u];
head[u]=cnt;
}/edge
//======================
int dis[maxn],vis[maxn],pre[maxn];
void spfa(int s)
{
memset(dis,0x1f,sizeof(dis));
dis[s]=0;
queue<int> q;
q.push(s);
vis[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(dis[v]>dis[u]+g[i].w)
{
dis[v]=dis[u]+g[i].w;
if(!vis[v])
{
vis[v]=1;
q.push(v);
pre[v]=u;
}
}
}
}
}
struct pir
{
int ds,b;
bool operator <(const pir &a)const
{
return ds<a.ds;
}
};
void dijkstra(int s)
{
memset(dis,0x1f,sizeof(dis));
dis[s]=0;
priority_queue<pir> q;
q.push((pir){0,s});
while(!q.empty())
{
pir p=q.top();
q.pop();
int u=p.b;
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(dis[v]>dis[u]+g[i].w)
{
dis[v]=dis[u]+g[i].w;
pre[v]=u;
q.push((pir){dis[v],v});
}
}
}
}//最短路
//======================
stk st;
int dfn[maxn],low[maxn],cut[maxn],scc[maxn],sccnum[maxn],scnt=0,dcnt=0,ccnt=0,bcnt=0;
inline void tarjan(int u)
{
dfn[u]=low[u]=++dcnt;
st.push(u);
for(register int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!vis[v])
{
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u])
{
scnt++;
int v;
do
{
sccnum[scnt]++;
v=st.pop();
scc[v]=scnt;
}while(v!=u);
}
}//强连通分量
int use[maxn];
bool xyl(int u)
{
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(!vis[v])
{
vis[v]=1;
if(!use[v]||xyl(use[v]))
{
use[v]=u;
return true;
}
}
}
return false;
}
int get_xyl(int n)
{
int cnt=0;
for(int i=1;i<=n;++i)
{
memset(vis,0,sizeof(vis));
cnt+=xyl(i);
}
return cnt;
}//二分图
int deep[maxn],cur[maxn],s,t,n,m;
inline bool bfs()
{
queue<int> q;
memset(deep,0,sizeof(deep));
q.push(s);
deep[s]=1;
do
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=g[i].next)
{
int v=g[i].to;
long long w=g[i].w;
if(w>0&&!deep[v])
{
deep[v]=deep[u]+1;
q.push(v);
}
}
}while(!q.empty());
if(deep[t]==0)return false;
else return true;
}
inline long long dfs(int u,long long d)
{
if(u==t)return d;
long long ans=0;
for(int& i=cur[u];i!=-1;i=g[i].next)
{
int v=g[i].to;
long long w=g[i].w;
if(deep[v]==deep[u]+1&&w)
{
int d2=dfs(v,min(d,w));
if(d2)
{
d-=d2;
ans+=d2;
g[i].w-=d2;
g[i^1].w+=d2;
if(!d)break;
}
}
}
return ans;
}
inline long long dinic()
{
long long ans=0;
while(bfs())
{
for(int i=1;i<=n;++i)cur[i]=head[i];
ans+=dfs(s,114514114514ll);
}
return ans;
}//网络流