#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int n,m,cnt,head[10010],ST,ED;
struct e{int nxt,to,c,f;}E[200010];
void add_edge(int u,int v,int c){
E[cnt].nxt=head[u];E[cnt].to=v;E[cnt].c=c;head[u]=cnt++;
E[cnt].nxt=head[v];E[cnt].to=u;E[cnt].c=0;head[v]=cnt++;
}
int level[10010],vis[10010];
bool bfs(){
queue<int> Q;
Q.push(ST);
vis[ST]=1;
while(!Q.empty()){
int u=Q.front();
Q.pop();
for(int i=head[u];~i;i=E[i].nxt){
e Edg=E[i];int v=Edg.to;
if(!vis[v] && Edg.c>Edg.f){
vis[v]=1;
level[v]=level[u]+1;
if(v==ED) return 1;
Q.push(v);
}
}
}
return 0;
}
long long dfs(int u,int imp){
if(u==ED || imp==0) return imp;
long long ret=0;int f;
for(int i=head[u];~i;i=E[i].nxt){
e Edg=E[i];int v=Edg.to;
f=dfs(v,min(imp,Edg.c-Edg.f));
if(level[v]==level[u]+1 && f>0){
Edg.f+=f;
E[i^1].f-=f;
ret+=f;
imp-=f;
if(imp==0) break;
}
}
return ret;
}
long long Dinic(){
long long flow=0;
while(bfs()) flow+=dfs(ST,inf);
return flow;
}
int main(){
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int s,e,c;
scanf("%d%d%d",&s,&e,&c);
add_edge(s,e,c);
}
scanf("%d%d",&ST,&ED);
printf("%lld",Dinic());
return 0;
}