#include <iostream>
#include <set>
#include <vector>
#include <deque>
#include <map>
#include <cmath>
#include <random>
#include <algorithm>

#define se second
#define fi first
#define mp make_pair
#define pb push_back

typedef long long ll;
typedef long double ld;

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<pair<int, pair<int, int>>> vert(m);
    for (int i = 0; i < m; i++) {
        int x, y, w;
        cin >> x >> y >> w;
        x--, y--;
        vert[i] = {w, {x, y}};
    }
    vector<bool> used(n, false);
    used[0] = true;
    vector<pair<int, int>> ostov;
    int answ = 0;
    for (int _ = 0; _ < n - 1; _++) {
        pair<int, pair<int, int>> mn = {10000000, {-1, -1}};
        for (int i = 0; i < m; i++) {
            if (used[vert[i].se.fi] != used[vert[i].se.se]) {
                mn = min(mn, vert[i]);
            }
        }
        ostov.push_back(mn.se);
        answ += mn.fi;
        used[mn.se.fi] = true;
        used[mn.se.se] = true;
    }
    cout << answ << '\n';
    for (auto e : ostov) {
        cout << e.fi + 1 << ' ' << e.se + 1 << '\n';
    }
    return 0;
}