#include <bits/stdc++.h>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int NMAX = 2e5 + 1;
int n, m, ans = 0;
bool vis[NMAX];
vector<pair<int, int>> vec[NMAX], tree;
void prim()
{
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push({0, 1});
while(!pq.empty())
{
auto [cost, u] = pq.top(); pq.pop();
if(vis[u])
continue;
vis[u] = true;
ans += cost;
for(auto vecin : vec[u])
{
if(!vis[vecin.first])
{
pq.push({vecin.second, vecin.first});
tree.push_back({u, vecin.first});
}
}
}
}
int main()
{
fin >> n >> m;
while(m--)
{
int u, v, cost;
fin >> u >> v >> cost;
vec[u].push_back({v, cost});
vec[v].push_back({u, cost});
}
prim();
fout << ans << "\n" << tree.size() << "\n";
for(auto edge : tree)
fout << edge.first << " " << edge.second << "\n";
return 0;
}