#include <bits/stdc++.h>
using namespace std ;
#define ll long long
#define sz(x) x.size()
// bitmasks
// Number of leading zeroes: __builtin_clz(x)
// Number of trailing zeroes : __builtin_ctz(x)
// Number of 1-bits: __builtin_popcount(x);
// last one : __lg()
template<typename T = ll, ll Base = 1>
struct DSU {
vector<T> parent, Gsize, nxt, tail, pos, roots;
DSU(ll MaxNodes) {
parent = Gsize = roots = tail = pos = nxt = vector<T>(MaxNodes + Base);
for (ll i = Base; i < MaxNodes + Base; i++) {
parent[i] = roots[i] = pos[i] = tail[i] = i;
nxt[i] = -1, Gsize[i] = 1;
}
}
T find_leader(ll node) {
return parent[node] = (parent[node] == node ? node : find_leader(parent[node]));
}
bool is_same_sets(ll u, ll v) {
return find_leader(u) == find_leader(v);
}
bool union_sets(ll u, ll v) {
ll leader_u = find_leader(u), leader_v = find_leader(v);
if (leader_u == leader_v) return 0;
// make leader_u is the leader with the larger component
if (Gsize[leader_u] < Gsize[leader_v])
swap(leader_u, leader_v);
ll p = pos[leader_v];
Gsize[leader_u] += Gsize[leader_v];
parent[leader_v] = leader_u;
roots[p] = roots.back();
pos[roots[p]] = p;
roots.pop_back();
nxt[tail[leader_u]] = leader_v;
tail[leader_u] = tail[leader_v];
return 1;
}
void print() {
for (ll root = Base; root < sz(roots); root++) {
for (ll u = roots[root]; ~u; u = nxt[u])
cout << u << " \n"[!~nxt[u]];
}
}
vector<vector<ll> > get_components() {
vector<vector<ll> > components;
for (ll root = Base; root < sz(roots); root++) {
vector<ll> component;
for (ll u = roots[root]; ~u; u = nxt[u])
component.push_back(u);
components.push_back(component);
}
return components;
}
ll get_size(ll u) {
return Gsize[find_leader(u)];
}
ll get_components_number() {
return sz(roots) - Base;
}
ll has_supervisor(ll b) {
return parent[b] != b;
}
};
struct edge {
ll u, v, w;
};
const ll MOD = 1e9;
void solve() {
ll n;
cin >> n;
ll m;
cin >> m;
vector<edge> E(m);
for (ll i = 0; i < m; i++) {
cin >> E[i].u >> E[i].v >> E[i].w;
}
sort(E.begin(), E.end(), [&](const edge &x, const edge &y) {
return x.w > y.w;
});
ll ans = 0, current_pairs = 0;
DSU<ll> dsu(n);
for (auto &e: E) {
ll u = e.u, v = e.v, w = e.w;
ll up = dsu.find_leader(u), vp = dsu.find_leader(v);
ll us = dsu.get_size(u), vs = dsu.get_size(v);
ll num = current_pairs;
if (up != vp) {
num += us * vs;
}
ans = (ans + w * (num % MOD) % MOD) % MOD;
if (up != vp) {
dsu.union_sets(u, v);
current_pairs += us * vs;
}
}
cout << ans << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// ll t;
// cin >> t;
// while (t--)
solve();
}