#pragma warning(disable:4996)#include<iostream>#include<string>#include<cmath>#include<ctype.h>#include<memory.h>#include<string.h>#include<algorithm>#include<map>#include<iomanip>#include<set>#include<list>#include<vector>#include<stack>#include<queue>#define ll long long intusingnamespace std;constint INF =0x3f3f3f3f;constint maxn =110;struct EDGE
{int u, v, w;};boolcmp(EDGE a, EDGE b){return a.w < b.w;}int n, m;
EDGE edge[maxn * maxn];int par[maxn];int path[maxn];intfind(int x){if(par[x]== x)return par[x];return par[x]=find(par[x]);}voidinitialize(){for(int i =0; i <= n; i++)//要有=啊!不然就錯了,所以以後直接i<maxn,乾脆全部初始化了算了
par[i]= i;}intmain(){int T; cin >> T;while(T--){
cin >> n >> m;for(int i =0; i < m; i++)
cin >> edge[i].u >> edge[i].v >> edge[i].w;initialize();sort(edge, edge + m, cmp);int cnt =0;//記錄路徑時候用int ans =0;//保存最小生成樹的結果for(int i =0; i < m; i++){int fa =find(edge[i].u);int fb =find(edge[i].v);if(fa != fb){
par[fb]= fa;
ans += edge[i].w;
path[cnt++]= i;}}int flag =1;//去掉已經得到的最小生成樹的每一條邊,再次計算最小生成樹,//隨後求值,如果刪除一條之後,所得值和之前相等,則說明最小生成樹不唯一for(int ii =0; ii < cnt; ii++){initialize();int sum =0;//用來求後來的最小生成樹的值int edge_cnt =0;//判斷能否構成最小生成樹for(int i =0; i < m; i++){if(i == path[ii])continue;//如果是要刪去的這條邊,則跳過int fa =find(edge[i].u);int fb =find(edge[i].v);if(fa != fb){
par[fb]= fa;
sum += edge[i].w;
edge_cnt++;}}//cout << sum << " ";if(edge_cnt == n -1&& sum == ans){//cout << "Not Unique!" << endl;
flag =0;//break;}}if(flag)::cout << ans << endl;else::cout <<"Not Unique!"<< endl;}return0;}