#include<bits/stdc++.h> using namespace std; int n,m; struct edge { int x; int y; int len; }edges[100005]; bool up1(edge a,edge b) { return a.len<b.len; } bool down1(edge a,edge b) { return a.len>b.len; } int parent[100005]; int ffind(int x) { if(x==parent[x]) return x; else return parent[x]=ffind(parent[x]); } void sset() { for(int i=1;i<=n;i++) { parent[i]=i; } } int kruskal() { sset(n); int ans=0; int num=0; for(int i=1;i<=m;i++) { int a1=ffind(edges[i].x); int a2=ffind(edges[i].y); if(a1!=a2) { ans=ans+edges[i].len; parent[a1]=a2; num++; } } if(num==n-1) return ans; else return 0; } int main() { cin>>n>>m; for(int i=1;i<=m;i++) { cin>>edges[i].x>>edges[i].y>>edges[i].len; } sort(edges+1,edges+m+1,up1); int min1=kruskal(); sort(edges+1,edges+m+1,down1); int max1=kruskal(); if(min1) cout<<min1<<endl; if(max1) cout<<max1<<endl; return 0; }