#define int long long
using namespace std;
struct node{
int to,val;
bool operator <(const node &b) const{
return val>b.val;
}
};
int n,m;
vector <node> fir[1003],sec[1003];
int ans;
priority_queue<node> q;
int dis[1003];
bool book[1003];
void bfs(){
q.push({1,0});
while(!q.empty()){
int now =(q.top()).to;
q.pop();
if(book[now])continue;
book[now]=1;
for(int i=0;i < (fir[now].size());i++){
if(dis[now]+fir[now][i].val<dis[fir[now][i].to]){
dis[fir[now][i].to]=dis[now]+fir[now][i].val;
q.push({fir[now][i].to,dis[fir[now][i].to]});
}
}
}
}
void bfs2(){
q.push({1,0});
while(!q.empty()){
int now =(q.top()).to;
q.pop();
if(book[now])continue;
book[now]=1;
for(int i=0;i < (sec[now].size());i++){
if(dis[now]+sec[now][i].val<dis[sec[now][i].to]){
dis[sec[now][i].to]=dis[now]+sec[now][i].val;
q.push({sec[now][i].to,dis[sec[now][i].to]});
}
}
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
fir[x].push_back({y,z});
sec[y].push_back({x,z});
}
for(int i=2;i<=n;i++)dis[i]=0x3f3f3f3f;
bfs();
book[1]=0;dis[1]=0;
for(int i=2;i<=n;i++)
{
ans+=dis[i];
dis[i]=0x3f3f3f3f;
book[i]=0;
}
cout<<ans<<endl;
bfs2();
for(int i=2;i<=n;i++)ans+=dis[i];
cout<<ans;
}