#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "math.h"
#include "algorithm"
#include <queue>
using namespace std;
#define error 100000000
int n,m; // n为点的总数 m为路径总数
int mp[500][500],a,b,c;
int vis[500],w[500],minc,combine[500];
void search1(int &s,int &t)
{
memset(vis,0,sizeof vis);
memset(w,0,sizeof w); //初始化
int tempj=error; //记录边权最大的位置
for(int i=0;i<n;i++)
{
int max1=-error;
for(int j=0;j<n;j++)
if(!vis[j]&&!combine[j]&&max1<w[j]){ //如果没有用访问过且没有被缩点且大于max1
max1=w[j];
tempj=j;
}
if(tempj==t) { //如果找完了
minc=w[tempj];return;
}
vis[tempj]=1;
s=t,t=tempj;
for(int j=0;j<n;j++)
if(!vis[j]&&!combine[j]) //将该点加入集合并且更新相关边的权值
w[j]+=mp[t][j];
}
minc=w[t]; // 如果找不到 即两点不连通
}
int mincut()
{
int s,t;
int ans=error;
memset(combine,0,sizeof combine);
for(int i=0;i<n-1;i++)
{
s=t=-1; //每回查找初始化
search1(s,t);
combine[t]=1; //将倒数第一个和倒数第二个缩点
ans=min(ans,minc);
for(int j=0;j<n;j++) //更改相关值
{
mp[j][s]+=mp[j][t];
mp[s][j]+=mp[t][j];
}
}
return ans;
}
int main(void)
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(mp,0,sizeof(mp));
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
mp[a][b]+=c;
mp[b][a]+=c;
}
printf("%d\n",mincut());
}
}
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "math.h"
#include "algorithm"
#include <queue>
using namespace std;
#define error 100000000
int n,m; // n为点的总数 m为路径总数
int mp[500][500],a,b,c;
int vis[500],w[500],minc,combine[500];
void search1(int &s,int &t)
{
memset(vis,0,sizeof vis);
memset(w,0,sizeof w); //初始化
int tempj=error; //记录边权最大的位置
for(int i=0;i<n;i++)
{
int max1=-error;
for(int j=0;j<n;j++)
if(!vis[j]&&!combine[j]&&max1<w[j]){ //如果没有用访问过且没有被缩点且大于max1
max1=w[j];
tempj=j;
}
if(tempj==t) { //如果找完了
minc=w[tempj];return;
}
vis[tempj]=1;
s=t,t=tempj;
for(int j=0;j<n;j++)
if(!vis[j]&&!combine[j]) //将该点加入集合并且更新相关边的权值
w[j]+=mp[t][j];
}
minc=w[t]; // 如果找不到 即两点不连通
}
int mincut()
{
int s,t;
int ans=error;
memset(combine,0,sizeof combine);
for(int i=0;i<n-1;i++)
{
s=t=-1; //每回查找初始化
search1(s,t);
combine[t]=1; //将倒数第一个和倒数第二个缩点
ans=min(ans,minc);
for(int j=0;j<n;j++) //更改相关值
{
mp[j][s]+=mp[j][t];
mp[s][j]+=mp[t][j];
}
}
return ans;
}
int main(void)
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(mp,0,sizeof(mp));
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
mp[a][b]+=c;
mp[b][a]+=c;
}
printf("%d\n",mincut());
}
}