http://poj.org/problem?id=1679
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n,m;
const int maxn=100+10;
const int inf=0x3f3f3f3f;
struct Edge{
int u,v,w;
bool vis;
}e[20010];
bool cmp(Edge a,Edge b){
return a.w<b.w;
}
vector<int> G[maxn];
int maxd[maxn][maxn];
int p[maxn];
int findset(int x){return x==p[x]?x:p[x]=findset(p[x]);}
void kruskal(){
sort(e,e+m,cmp);
for(int i=0;i<=n;i++){
G[i].clear();
p[i]=i;
G[i].push_back(i);
}
int sum=0,k=0;
for(int i=0;i<m;i++){
if(k==n-1)break;
int u=findset(e[i].u),v=findset(e[i].v);
if(u!=v){
k++;
e[i].vis=true;
sum+=e[i].w;
for(int j=0;j<G[u].size();j++){
for(int k=0;k<G[v].size();k++){
maxd[G[u][j]][G[v][k]]=maxd[G[v][k]][G[u][j]]=e[i].w;
}
}
p[u]=v;
for(int j=0;j<G[u].size();j++){
G[v].push_back(G[u][j]);
}
}
}
int cisum=inf;
for(int i=0;i<m;i++){
if(!e[i].vis){
cisum=min(cisum,sum+e[i].w-maxd[e[i].u][e[i].v]);
}
}
if(cisum>sum) printf("%d\n",sum);
else printf("Not Unique!\n");
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
e[i].vis=false;
}
kruskal();
}
return 0;
}