显然裸的全局最小割
//O(n^3)
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
//#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define MEM(a,x) memset(a,x,sizeof(a))
#define lowbit(x) ((x)&-(x))
using namespace std;
const int N = 500 +5;
struct SW{
const static int maxn=500+5;
int n;
ll g[maxn][maxn],b[maxn],dist[maxn];
void init(int nn,int w[maxn][maxn]){
int i,j;
n=nn;
for(i=1;i<=n;++i){
for(j=1;j<=n;++j){
g[i][j]=w[i][j];
}
}
}
ll Min_Cut_Phase(int ph,int&x,int&y){
int i,j,t;
b[t=1]=ph;
for(i=1;i<=n;++i){
if(b[i]!=ph) {
dist[i]=g[1][i];
}
}
for(i=1;i<n;++i){
x=t;
for(t=0,j=1;j<=n;++j){
if(b[j]!=ph&&(!t||dist[j]>dist[t])){
t=j;
}
}
b[t]=ph;
for(j=1;j<=n;++j){
if(b[j]!=ph){
dist[j]+=g[t][j];
}
}
}
return y=t,dist[t];
}
void Merge(int x,int y){
if(x>y){
swap(x,y);
}
for(int i=1;i<=n;++i){
if(i!=x&&i!=y){
g[i][x]+=g[i][y],g[x][i]+=g[i][y];
}
}
if(y==n){
return;
}
for(int i=1;i<n;++i){
if(i!=y){
swap(g[i][y],g[i][n]);
swap(g[y][i],g[n][i]);
}
}
}
ll Min_Cut(){
ll ret=1e18;
fill(b,b+n+1,0);
int x,y;
for(int i=1;n>1;++i,--n){
ret=min(ret,Min_Cut_Phase(i,x,y));
Merge(x,y);
}
return ret;
}
}sw;
int main()
{
//freopen("/home/lu/code/r.txt","r",stdin);
//freopen("/home/lu/code/w.txt","w",stdout);
int n,m;
while(~scanf("%d%d",&n,&m)){
sw.n=n;
MEM(sw.g,0);
for(int i=0;i<m;++i){
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
++u,++v;
sw.g[u][v]+=c;
sw.g[v][u]+=c;
}
printf("%d\n",sw.Min_Cut());
}
return 0;
}