#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
struct edge {
  int nex, to;
  long long w;
} e[100100 << 2];
int n, m, cnt, sum;
int head[100100], vis[100100];
long long a[100100], b[65], w[65][2], pw[65], S;
void add(int x, int y, long long z) {
  e[++cnt].to = y;
  e[cnt].nex = head[x];
  e[cnt].w = z;
  head[x] = cnt;
}
void insert(long long x) {
  if (!x) return;
  S |= x;
  for (int i = 62; i >= 0; i--)
    if (x >> i & 1) {
      if (!b[i]) {
        b[i] = x, sum++;
        break;
      } else
        x ^= b[i];
    }
}
void dfs(int x) {
  for (int i = 0; i <= 62; i++) w[i][a[x] >> i & 1]++;
  vis[x] = 1;
  for (int i = head[x]; i; i = e[i].nex) {
    int v = e[i].to;
    if (!vis[v]) {
      a[v] = a[x] ^ e[i].w;
      dfs(v);
    } else
      insert(a[x] ^ a[v] ^ e[i].w);
  }
}
void add(long long &x, long long y) {
  x += y;
  if (x >= mod) x -= mod;
}
long long C(long long x) { return (x * (x - 1) / 2) % mod; }
long long cal() {
  long long res = 0;
  for (int i = 0; i <= 62; i++) {
    long long ret = 0;
    if (S >> i & 1) {
      add(ret, w[i][0] * w[i][1] % mod * pw[sum - 1] % mod);
      add(ret, (C(w[i][0]) + C(w[i][1])) % mod * pw[sum - 1] % mod);
    } else {
      add(ret, w[i][0] * w[i][1] % mod * pw[sum] % mod);
    }
    add(res, ret * pw[i] % mod);
  }
  return res;
}
int x, y;
long long z, ans;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%lld", &x, &y, &z);
    add(x, y, z);
    add(y, x, z);
  }
  pw[0] = 1;
  for (int i = 1; i <= 62; i++) pw[i] = pw[i - 1] * 2 % mod;
  for (int i = 1; i <= n; i++)
    if (!vis[i]) {
      S = sum = 0;
      memset(b, 0, sizeof(b));
      memset(w, 0, sizeof(w));
      dfs(i);
      add(ans, cal());
    }
  printf("%lld\n", ans);
  return 0;
}
