/// MaxFlow with dinic by muoii
/// vn.spoj.com/problems/NKFLOW/
#include <bits/stdc++.h>
using namespace std;
#define tag "spoj"
#define maxn 0
#define maxc 0
#define oo 1000000007
#define mid ((l+r)>>1)
#define meset(a,x) memset(a,x,sizeof(a))
#define loop(x) for(int LoOpEr=x;LoOpEr-->0;)
///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define long long long
struct network{
int n;
///data: E,adj,lev,cur
vector< vector<int> > adj;
vector<int> lev,cur;
struct edge{
int depa,dest;
long cap,flow;
#define residual(e) ((e.flow<0?0:e.cap)-e.flow)
///#define cost(e) ((e.flow<0?-1:1)*e.cost)
};
vector<edge> E;
network(): n(0), E(0), adj(0), lev(0), cur(0) {};
network(const int &N): n(N), E(0), adj(N+1), lev(N+1), cur(N+1) {};
void add_edge(const int &u,const int &v,const int &cap,const bool &arcs)
{
adj[u].push_back(E.size());E.push_back({u,v,cap,0});
adj[v].push_back(E.size());E.push_back({v,u,arcs?0:cap,0});
}
queue<int> Q;
bool augment(const int &s,const int &t)
{
fill(lev.begin(),lev.end(),-1);
lev[s]=0;
Q.push(s);
int u;
edge e;
while(Q.size())
{
u=Q.front(),Q.pop();
cur[u]=0;
for(const int &ide: adj[u])
{
e=E[ide];
if(lev[e.dest]<0 && residual(e)>0)
{
lev[e.dest]=lev[u]+1;
Q.push(e.dest);
}
}
}
return lev[t]>0;
}
long augmenting(const int &u,const long &mincap,const int &sink)
{
if(u==sink || mincap==0) return mincap;
long rep=0;
int v,ide;
while(cur[u]<adj[u].size())
{
v=E[ide=adj[u][cur[u]]].dest;
if(lev[u]+1==lev[v] && residual(E[ide])>0)
if(rep=augmenting(v,min(mincap,residual(E[ide])),sink))
{
E[ide].flow+=rep;
E[ide^1].flow-=rep;
return rep;
}
++cur[u];
}
return rep;
}
int MaxFlow(const int &s,const int &t)
{
int rep=0,delta;
while(augment(s,t))
{
while(delta=augmenting(s,oo,t))
rep+=delta;
}
return rep;
}
};
int main()
{
#ifdef dmdd
freopen(tag".inp","r",stdin); freopen(tag".out","w",stdout);
#endif // dmdd
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n,m,s,t;
cin>>n>>m>>s>>t;
network net(n);
int u,v,w;
loop(m) cin>>u>>v>>w,net.add_edge(u,v,w,1);
cout<<net.MaxFlow(s,t);
return 0;
}
Ly8vIE1heEZsb3cgd2l0aCBkaW5pYyBieSBtdW9paQoKLy8vIHZuLnNwb2ouY29tL3Byb2JsZW1zL05LRkxPVy8KCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIHRhZyAic3BvaiIKI2RlZmluZSBtYXhuIDAKI2RlZmluZSBtYXhjIDAKI2RlZmluZSBvbyAxMDAwMDAwMDA3CiNkZWZpbmUgbWlkICgobCtyKT4+MSkKI2RlZmluZSBtZXNldChhLHgpIG1lbXNldChhLHgsc2l6ZW9mKGEpKQojZGVmaW5lIGxvb3AoeCkgZm9yKGludCBMb09wRXI9eDtMb09wRXItLT4wOykKLy8vPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PgojZGVmaW5lIGxvbmcgbG9uZyBsb25nCnN0cnVjdCBuZXR3b3JrewoKICAgIGludCBuOwogICAgLy8vZGF0YTogRSxhZGosbGV2LGN1cgogICAgdmVjdG9yPCB2ZWN0b3I8aW50PiA+IGFkajsKICAgIHZlY3RvcjxpbnQ+IGxldixjdXI7CiAgICBzdHJ1Y3QgZWRnZXsKICAgICAgICBpbnQgZGVwYSxkZXN0OwogICAgICAgIGxvbmcgY2FwLGZsb3c7CgogICAgICAgICNkZWZpbmUgcmVzaWR1YWwoZSkgKChlLmZsb3c8MD8wOmUuY2FwKS1lLmZsb3cpCiAgICAgICAgLy8vI2RlZmluZSBjb3N0KGUpICgoZS5mbG93PDA/LTE6MSkqZS5jb3N0KQogICAgfTsKICAgIHZlY3RvcjxlZGdlPiBFOwoKICAgIG5ldHdvcmsoKTogbigwKSwgRSgwKSwgYWRqKDApLCBsZXYoMCksIGN1cigwKSB7fTsKCiAgICBuZXR3b3JrKGNvbnN0IGludCAmTik6IG4oTiksIEUoMCksIGFkaihOKzEpLCBsZXYoTisxKSwgY3VyKE4rMSkge307CgogICAgdm9pZCBhZGRfZWRnZShjb25zdCBpbnQgJnUsY29uc3QgaW50ICZ2LGNvbnN0IGludCAmY2FwLGNvbnN0IGJvb2wgJmFyY3MpCiAgICB7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayhFLnNpemUoKSk7RS5wdXNoX2JhY2soe3UsdixjYXAsMH0pOwogICAgICAgIGFkalt2XS5wdXNoX2JhY2soRS5zaXplKCkpO0UucHVzaF9iYWNrKHt2LHUsYXJjcz8wOmNhcCwwfSk7CiAgICB9CgogICAgcXVldWU8aW50PiBROwogICAgYm9vbCBhdWdtZW50KGNvbnN0IGludCAmcyxjb25zdCBpbnQgJnQpCiAgICB7CiAgICAgICAgZmlsbChsZXYuYmVnaW4oKSxsZXYuZW5kKCksLTEpOwogICAgICAgIGxldltzXT0wOwogICAgICAgIFEucHVzaChzKTsKIAogICAgICAgIGludCB1OwogICAgICAgIGVkZ2UgZTsKICAgICAgICB3aGlsZShRLnNpemUoKSkKICAgICAgICB7CiAgICAgICAgICAgIHU9US5mcm9udCgpLFEucG9wKCk7CiAgICAgICAgICAgIGN1clt1XT0wOwogICAgICAgICAgICBmb3IoY29uc3QgaW50ICZpZGU6IGFkalt1XSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZT1FW2lkZV07CiAgICAgICAgICAgICAgICBpZihsZXZbZS5kZXN0XTwwICYmIHJlc2lkdWFsKGUpPjApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGV2W2UuZGVzdF09bGV2W3VdKzE7CiAgICAgICAgICAgICAgICAgICAgUS5wdXNoKGUuZGVzdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxldlt0XT4wOwogICAgfQoKCiAgICBsb25nIGF1Z21lbnRpbmcoY29uc3QgaW50ICZ1LGNvbnN0IGxvbmcgJm1pbmNhcCxjb25zdCBpbnQgJnNpbmspCiAgICB7CiAgICAgICAgaWYodT09c2luayB8fCBtaW5jYXA9PTApIHJldHVybiBtaW5jYXA7CgogICAgICAgIGxvbmcgcmVwPTA7CgogICAgICAgIGludCB2LGlkZTsKICAgICAgICB3aGlsZShjdXJbdV08YWRqW3VdLnNpemUoKSkKICAgICAgICB7CiAgICAgICAgICAgIHY9RVtpZGU9YWRqW3VdW2N1clt1XV1dLmRlc3Q7CgogICAgICAgICAgICBpZihsZXZbdV0rMT09bGV2W3ZdICYmIHJlc2lkdWFsKEVbaWRlXSk+MCkKICAgICAgICAgICAgICAgIGlmKHJlcD1hdWdtZW50aW5nKHYsbWluKG1pbmNhcCxyZXNpZHVhbChFW2lkZV0pKSxzaW5rKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBFW2lkZV0uZmxvdys9cmVwOwogICAgICAgICAgICAgICAgICAgIEVbaWRlXjFdLmZsb3ctPXJlcDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICArK2N1clt1XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcDsKICAgIH0KCiAgICBpbnQgTWF4Rmxvdyhjb25zdCBpbnQgJnMsY29uc3QgaW50ICZ0KQogICAgewogICAgICAgIGludCByZXA9MCxkZWx0YTsKCiAgICAgICAgd2hpbGUoYXVnbWVudChzLHQpKQogICAgICAgIHsKICAgICAgICAgICAgd2hpbGUoZGVsdGE9YXVnbWVudGluZyhzLG9vLHQpKQogICAgICAgICAgICAgICAgcmVwKz1kZWx0YTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcDsKICAgIH0KfTsKaW50IG1haW4oKQp7CiAgICAjaWZkZWYgZG1kZAogICAgZnJlb3Blbih0YWciLmlucCIsInIiLHN0ZGluKTsgZnJlb3Blbih0YWciLm91dCIsInciLHN0ZG91dCk7CiAgICAjZW5kaWYgLy8gZG1kZAogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CgogICAgaW50IG4sbSxzLHQ7CiAgICBjaW4+Pm4+Pm0+PnM+PnQ7CiAgICBuZXR3b3JrIG5ldChuKTsKCiAgICBpbnQgdSx2LHc7CiAgICBsb29wKG0pIGNpbj4+dT4+dj4+dyxuZXQuYWRkX2VkZ2UodSx2LHcsMSk7CgogICAgY291dDw8bmV0Lk1heEZsb3cocyx0KTsKICAgIHJldHVybiAwOwp9Cgo=