#include using namespace std; templateistream &operator>>(istream&,pair&); templateistream &operator>>(istream&,tuple&a); templateistream &operator>>(istream&is,vector&a); templateistream &operator>>(istream&is,array&a); template istream &operator>>(istream&is,pair&a){ is>>a.first>>a.second; return is; } template void read_tuple(istream&is,tuple&a){ if constexpr(pos>::value){ is>>get(a); read_tuple(is,a); } } template istream &operator>>(istream&is,tuple&a){ read_tuple<0>(is,a); return is; } template istream &operator>>(istream&is,vector&a){ for(T&x:a)is>>x; return is; } template istream &operator>>(istream&is,array&a){ for(T&x:a)is>>x; return is; } templateostream &operator<<(ostream&os,const pair&); templateostream &operator<<(ostream&os,const tuple&); templateostream &operator<<(ostream&os,const vector&); templateostream &operator<<(ostream&os,priority_queue); templateostream &operator<<(ostream&os,queue); templateostream &operator<<(ostream&os,deque); templateostream &operator<<(ostream&os,stack); templateostream &operator<<(ostream&os,const array&); templateostream &operator<<(ostream&os,const map&); templateostream &operator<<(ostream&os,const unordered_map&); templateostream &operator<<(ostream&os,const set&); templateostream &operator<<(ostream&os,const multiset&); templateostream &operator<<(ostream&os,const unordered_set&); template ostream &operator<<(ostream&os,const pair&a){ os< void write_tuple(ostream&os,const tuple&a){ if constexpr(pos>::value){ if constexpr(pos>0)os<<' '; os<(a); write_tuple(os,a); } } template ostream &operator<<(ostream&os,const tuple&a){ write_tuple<0>(os,a); return os; } template ostream &operator<<(ostream&os,const vector&a){ os<<'{'; for(int i=0;i<(int)a.size();i++){ os< ostream &operator<<(ostream&os,priority_queuea){ os<<'{'; if(!a.empty()){ os< ostream &operator<<(ostream&os,queuea){ os<<'{'; if(!a.empty()){ os< ostream &operator<<(ostream&os,dequea){ os<<'{'; if(!a.empty()){ os< ostream &operator<<(ostream&os,stacka){ os<<'{'; if(!a.empty()){ os< ostream &operator<<(ostream&os,const array&a){ os<<'{'; for(int i=0;i<(int)a.size();i++){ os< ostream &operator<<(ostream&os,const map&a){ if(a.empty()){ os<<"{}"; return os; } auto itr=a.begin(); os<<"{["<first<<","<second<<']'; while(++itr!=a.end())os<<",["<first<<','<second<<']'; os<<'}'; return os; } template ostream &operator<<(ostream&os,const unordered_map&a){ if(a.empty()){ os<<"{}"; return os; } auto itr=a.begin(); os<<"{["<first<<","<second<<']'; while(++itr!=a.end())os<<",["<first<<','<second<<']'; os<<'}'; return os; } template ostream &operator<<(ostream&os,const set&a){ if(a.empty()){ os<<"{}"; return os; } auto itr=a.begin(); os<<'{'<<*itr; while(++itr!=a.end())os<<','<<*itr; os<<'}'; return os; } template ostream &operator<<(ostream&os,const multiset&a){ if(a.empty()){ os<<"{}"; return os; } auto itr=a.begin(); os<<'{'<<*itr; while(++itr!=a.end())os<<','<<*itr; os<<'}'; return os; } template ostream &operator<<(ostream&os,const unordered_set&a){ if(a.empty()){ os<<"{}"; return os; } auto itr=a.begin(); os<<'{'<<*itr; while(++itr!=a.end())os<<','<<*itr; os<<'}'; return os; } using namespace std; using ll=long long; using ull=unsigned long long; using P=pair; templateusing minque=priority_queue,greater>; templatebool chmax(T &a,const T &b){return (abool chmin(T &a,const T &b){return (a>b?(a=b,true):false);} templatevoid operator++(pair&a,int){a.first++,a.second++;} templatevoid operator--(pair&a,int){a.first--,a.second--;} templatevoid operator++(vector&a,int){for(auto &i:a)i++;} templatevoid operator--(vector&a,int){for(auto &i:a)i--;} #define overload3(_1,_2,_3,name,...) name #define rep1(i,n) for(int i=0;i<(int)(n);i++) #define rep2(i,l,r) for(int i=(int)(l);i<(int)(r);i++) #define rep(...) overload3(__VA_ARGS__,rep2,rep1)(__VA_ARGS__) #define reps(i,l,r) rep2(i,l,r) #define all(x) x.begin(),x.end() #define pcnt(x) __builtin_popcountll(x) #define fin(x) return cout<<(x)<<'\n',static_cast(0) #define yn(x) cout<<((x)?"Yes\n":"No\n") #define uniq(x) sort(all(x)),x.erase(unique(all(x)),x.end()) template inline int fkey(vector&z,T key){return lower_bound(z.begin(),z.end(),key)-z.begin();} ll myceil(ll a,ll b){return (a+b-1)/b;} template auto vec(const int (&d)[n],const T &init=T()){ if constexpr (id(d,init)); else return init; } #ifdef LOCAL #include #define SWITCH(a,b) (a) #else #define debug(...) static_cast(0) #define debugg(...) static_cast(0) #define SWITCH(a,b) (b) #endif struct Timer{ clock_t start; Timer(){ start=clock(); ios::sync_with_stdio(false); cin.tie(nullptr); cout<>testcase; for(int i=0;i template struct csr_array{ private: std::vectorptr; std::vectordat; public: using iterator=typename std::vector::iterator; using const_iterator=typename std::vector::const_iterator; struct csr{ iterator l,r; iterator begin(){return l;} iterator end(){return r;} int size()const{return r-l;} T &operator[](int i)const{return l[i];} }; struct const_csr{ const_iterator l,r; const_iterator begin(){return l;} const_iterator end(){return r;} int size()const{return r-l;} const T &operator[](int i)const{return l[i];} }; csr_array():ptr{0}{} csr_array(int n,const std::vector>&a):ptr(n+1),dat(a.size()){ for(const auto&[k,v]:a)ptr[k]++; for(int i=1;i<=n;i++)ptr[i]+=ptr[i-1]; for(int i=std::ssize(a);i--;)dat[--ptr[a[i].first]]=a[i].second; } explicit csr_array(int n,const std::vector&a):ptr(n+1),dat(a.size()){ static_assert(std::is_same_v); for(const int&x:a)ptr[x]++; for(int i=1;i<=n;i++)ptr[i]+=ptr[i-1]; for(int i=std::ssize(a);i--;)dat[--ptr[a[i]]]=i; } csr operator[](int i){return csr{dat.begin()+ptr[i],dat.begin()+ptr[i+1]};} const_csr operator[](int i)const{return const_csr{dat.begin()+ptr[i],dat.begin()+ptr[i+1]};} iterator begin(){return dat.begin();} iterator end(){return dat.end();} const_iterator begin()const{return dat.begin();} const_iterator end()const{return dat.end();} int size()const{return std::ssize(ptr)-1;} }; template struct Dinic{ private: struct edge{ int to,rev; T cap; }; int n; csr_arrayg; std::vector>init_csr; std::vector>pos; std::vectordeg; template struct Q{ std::vectordata; int p; Q():p(0){} void push(T2 x){ data.push_back(x); } int front()const{ return data[p]; } void pop(){p++;} void clear(){ data.clear(); p=0; } bool empty()const{ return p==data.size(); } }; public: Dinic():n(0){} Dinic(int n):n(n),deg(n){} void add_edge(int u,int v,T cap){ assert(0<=u&&uedges()const{ int m=pos.size(); std::vectorret(m); for(int i=0;i(n,init_csr); std::vectorlevel(n),iter(n); Qque; auto bfs=[&](){ std::fill(level.begin(),level.end(),-1); level[s]=0; que.clear(); que.push(s); while(!que.empty()){ int x=que.front(); que.pop(); for(auto e:g[x]){ if(e.cap==0||level[e.to]>=0)continue; level[e.to]=level[x]+1; if(e.to==t)return; que.push(e.to); } } }; auto dfs=[&](auto self,int v,T up)->T { if(v==s)return up; T ret=0; int lv=level[v]; for(int &i=iter[v];i<(int)g[v].size();i++){ edge e=g[v][i]; if(lv<=level[e.to]||g[e.to][e.rev].cap==0)continue; T d=self(self,e.to,std::min(up-ret,g[e.to][e.rev].cap)); if(d<=0)continue; g[v][i].cap+=d; g[e.to][e.rev].cap-=d; ret+=d; if(ret==up)return ret; } level[v]=n; return ret; }; T flow=0; while(flow::max()); } std::vectormin_cut(int s){ assert(0<=s&&sret(n,false); Qque; que.push(s); while(!que.empty()){ int x=que.front(); que.pop(); ret[x]=true; for(auto e:g[x]){ if(e.cap&&!ret[e.to]){ ret[e.to]=true; que.push(e.to); } } } return ret; } }; void SOLVE(){ int n,m,s,t; cin>>n>>m>>s>>t; s--,t--; Dinicg(n); rep(i,m){ int a,b,c; cin>>a>>b>>c; a--,b--; g.add_edge(a,b,c); } cout<