1 #include <cstdio>
2 #include <cstring>
3 #include <vector>
4 #include <queue>
5 using namespace std;
6 const int MAX_N=105;
7 const int MAX_M=5005;
8 const int INF=100000;
9 typedef pair<int,int> P;//cost,to
10 struct Edge
11 {
12 int to,cost;
13 Edge(){}
14 Edge(int tt,int cc):to(tt),cost(cc){}
15 };
16 int t;
17 int n,m;
18 vector<Edge> G[MAX_N];
19 int vis[MAX_N];
20 int mincost[MAX_N];
21
22 int prim()
23 {
24 int ans=0;
25 int flag=0;
26 priority_queue<P,vector<P>,greater<P> > que;
27 memset(vis,0,sizeof(vis));
28 for(int i=1;i<=n;i++) mincost[i]=INF;
29 que.push(P(0,1));
30 mincost[1]=0;
31 while(!que.empty())
32 {
33 P p=que.top();
34 que.pop();
35 int v=p.second;
36 if(vis[v]||mincost[v]<p.first) continue;
37 vis[v]=1;
38 mincost[v]=p.first;
39 ans+=mincost[v];
40 for(int i=0;i<G[v].size();i++)
41 {
42 int u=G[v][i].to;
43 if(!vis[u])
44 {
45 if(mincost[u]>G[v][i].cost&&G[v][i].cost<INF)
46 {
47 mincost[u]=G[v][i].cost;
48 que.push(P(mincost[u],u));
49 }else if(mincost[u]==G[v][i].cost)//存在到达点u权值相等且都为最小值的边
50 {
51 flag=1;
52 break;
53 }
54 }
55 }
56 if(flag) break;
57 }
58 if(flag) ans=-1;
59 return ans;
60 }
61 int main()
62 {
63 freopen("1679.txt","r",stdin);
64 scanf("%d",&t);
65 while(t--)
66 {
67 scanf("%d%d",&n,&m);
68 for(int i=1;i<=n;i++) G[i].clear();
69 for(int i=0;i<m;i++)
70 {
71 int u,v,w;
72 scanf("%d%d%d",&u,&v,&w);
73 G[u].push_back(Edge(v,w));
74 G[v].push_back(Edge(u,w));
75 }
76 if(n==1) {printf("0\n"); continue;}
77 int ans=prim();
78 if(ans==-1)
79 printf("Not Unique!\n");
80 else printf("%d\n",ans);
81 }
82 return 0;
83 }