#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;
}