#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int N = 2e5, oo = 2e18, MOD = 1e9+7;
struct DSU {
vector<int> sizes;
vector<int> parent;
DSU(int n) {
sizes.resize(n + 1);
parent.resize(n + 1);
for (int i = 0; i <= n; i++) {
parent[i] = i;
sizes[i] = 1;
}
}
int find_root(int u) {
if (parent[u] == u)
return u;
return parent[u] = find_root(parent[u]);
}
bool merge(int u, int v) {
int root_u = find_root(u);
int root_v = find_root(v);
if (root_u == root_v)
return 0;
if (sizes[root_u] > sizes[root_v])
swap(root_u, root_v);
parent[root_u] = root_v;
sizes[root_v] += sizes[root_u];
return 1;
}
};
int powmod(int b, int p) {
int res = 1;
while (p) {
if (p & 1) res = (res * b) % MOD;
b = (b * b) % MOD;
p >>= 1;
}
return res;
}
int inv(int b) {
return powmod(b, MOD - 2);
}
void solve() {
int n, m; cin >> n >> m;
vector<array<int, 3>> edges(m);
for (int i = 0; i < m; i++) {
for (int j = 0; j < 3; j++) cin >> edges[i][j];
edges[i][0]--;
edges[i][1]--;
}
vector<int> dp(1 << m);
for (int msk = (1 << m) - 1; msk >= 0; msk--) {
DSU d(n);
bool can = true;
for (int i = 0; i < m; i++) {
if (msk >> i & 1) {
if (!d.merge(edges[i][0], edges[i][1])) {
can = false;
break;
}
}
}
if (!can)
continue;
vector<array<int, 2>> cur;
int cnt = 0;
for (int i = 0; i < m; i++) {
if (msk >> i & 1) {
continue;
}
if (d.find_root(edges[i][0]) == d.find_root(edges[i][1]))
continue;
cur.push_back({edges[i][2], i});
cnt++;
}
for (auto [v, i] : cur) {
dp[msk] += ((dp[msk | (1 << i)] + v) % MOD) * inv(cnt) % MOD;
dp[msk] %= MOD;
}
}
cout << dp[0];
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
// #ifndef ONLINE_JUDGE
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
// #endif
int t; t = 1;
// cin >> t;
while (t--) solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGVuZGwgICAgICdcbicKI2RlZmluZSBpbnQgICAgICBsb25nIGxvbmcKCmNvbnN0IGludCBOID0gMmU1LCBvbyA9IDJlMTgsIE1PRCA9IDFlOSs3OwoKc3RydWN0IERTVSB7CiAgdmVjdG9yPGludD4gc2l6ZXM7CiAgdmVjdG9yPGludD4gcGFyZW50OwogIERTVShpbnQgbikgewogICAgc2l6ZXMucmVzaXplKG4gKyAxKTsKICAgIHBhcmVudC5yZXNpemUobiArIDEpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7CiAgICAgIHBhcmVudFtpXSA9IGk7CiAgICAgIHNpemVzW2ldID0gMTsKICAgIH0KICB9CiAgaW50IGZpbmRfcm9vdChpbnQgdSkgewogICAgaWYgKHBhcmVudFt1XSA9PSB1KQogICAgICByZXR1cm4gdTsKCiAgICByZXR1cm4gcGFyZW50W3VdID0gZmluZF9yb290KHBhcmVudFt1XSk7CiAgfQogIGJvb2wgbWVyZ2UoaW50IHUsIGludCB2KSB7CiAgICBpbnQgcm9vdF91ID0gZmluZF9yb290KHUpOwogICAgaW50IHJvb3RfdiA9IGZpbmRfcm9vdCh2KTsKICAgIGlmIChyb290X3UgPT0gcm9vdF92KQogICAgICByZXR1cm4gMDsKCiAgICBpZiAoc2l6ZXNbcm9vdF91XSA+IHNpemVzW3Jvb3Rfdl0pCiAgICAgIHN3YXAocm9vdF91LCByb290X3YpOwoKICAgIHBhcmVudFtyb290X3VdID0gcm9vdF92OwogICAgc2l6ZXNbcm9vdF92XSArPSBzaXplc1tyb290X3VdOwogICAgcmV0dXJuIDE7CiAgfQp9OwoKaW50IHBvd21vZChpbnQgYiwgaW50IHApIHsKICAgIGludCByZXMgPSAxOwogICAgd2hpbGUgKHApIHsKICAgICAgICBpZiAocCAmIDEpIHJlcyA9IChyZXMgKiBiKSAlIE1PRDsKICAgICAgICBiID0gKGIgKiBiKSAlIE1PRDsKICAgICAgICBwID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKaW50IGludihpbnQgYikgewogICAgcmV0dXJuIHBvd21vZChiLCBNT0QgLSAyKTsKfQoKCnZvaWQgc29sdmUoKSB7CiAgICBpbnQgbiwgbTsgY2luID4+IG4gPj4gbTsKICAgIHZlY3RvcjxhcnJheTxpbnQsIDM+PiBlZGdlcyhtKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyBqKyspIGNpbiA+PiBlZGdlc1tpXVtqXTsKICAgICAgICBlZGdlc1tpXVswXS0tOwogICAgICAgIGVkZ2VzW2ldWzFdLS07CiAgICB9CiAgICB2ZWN0b3I8aW50PiBkcCgxIDw8IG0pOwogICAgZm9yIChpbnQgbXNrID0gKDEgPDwgbSkgLSAxOyBtc2sgPj0gMDsgbXNrLS0pIHsKICAgICAgICBEU1UgZChuKTsKICAgICAgICBib29sIGNhbiA9IHRydWU7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICAgICAgaWYgKG1zayA+PiBpICYgMSkgewogICAgICAgICAgICAgICAgaWYgKCFkLm1lcmdlKGVkZ2VzW2ldWzBdLCBlZGdlc1tpXVsxXSkpIHsKICAgICAgICAgICAgICAgICAgICBjYW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWNhbikKICAgICAgICBjb250aW51ZTsKICAgICAgICAKICAgICAgICB2ZWN0b3I8YXJyYXk8aW50LCAyPj4gY3VyOwogICAgICAgIGludCBjbnQgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChtc2sgPj4gaSAmIDEpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkLmZpbmRfcm9vdChlZGdlc1tpXVswXSkgPT0gZC5maW5kX3Jvb3QoZWRnZXNbaV1bMV0pKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGN1ci5wdXNoX2JhY2soe2VkZ2VzW2ldWzJdLCBpfSk7CiAgICAgICAgICAgIGNudCsrOwogICAgICAgIH0KCiAgICAgICAgZm9yIChhdXRvIFt2LCBpXSA6IGN1cikgewogICAgICAgICAgICBkcFttc2tdICs9ICgoZHBbbXNrIHwgKDEgPDwgaSldICsgdikgJSBNT0QpICogaW52KGNudCkgJSBNT0Q7CiAgICAgICAgICAgIGRwW21za10gJT0gTU9EOwogICAgICAgIH0KICAgIH0KICAgIGNvdXQgPDwgZHBbMF07Cn0KCgpzaWduZWQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKICAgIGNpbi50aWUoTlVMTCk7IGNvdXQudGllKE5VTEwpOwogICAgLy8gI2lmbmRlZiBPTkxJTkVfSlVER0UgCiAgICAvLyAgICBmcmVvcGVuKCJpbnB1dC50eHQiLCAiciIsIHN0ZGluKTsgCiAgICAvLyAgICBmcmVvcGVuKCJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOyAKICAgIC8vICNlbmRpZiAKICAgIGludCB0OyB0ID0gMTsKICAgIC8vICBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pIHNvbHZlKCk7CiAgICByZXR1cm4gMDsKfQ==