Link to this code: https://cses.fi/paste/b0d693d2c2b9e1ee69a382/
#include<iostream>
#include<cmath>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define ll long long int
ll edges[501][501],n,m;
int par[501];
bool vis[501];
bool bfs(long long k){
  queue<int>que;
  int u=1;
  que.push(u);
  memset(vis,0,sizeof vis);
  while(!que.empty()){
   u=que.front();
   que.pop();
   if(vis[u])continue;
   vis[u]=true;
   if(u==n)return true;
    for(int v=1;v<=n;v++){
      if(edges[u][v] and k<=edges[u][v] and !vis[v]){
        par[v]=u;
        que.push(v);
      }
    }
  }
  return vis[n];
}
int main(){
  ll a,b,w,download=0;
  cin>>n>>m;
  for(int i=0;i<m;i++){
    cin>>a>>b>>w;
    edges[a][b]+=w;
  }
   long long k=1ll<<40;
    while(k){
     while(bfs(k)){
        a=n;
        while(a!=1){
          edges[par[a]][a]-=k;
          edges[a][par[a]]+=k;
          a=par[a];
        }
          download+=k;        
      }
    k>>=1;
  }
  cout<<download;
  return 0;
}