import java.util.*; import java.util.stream.*; import java.io.*; class UFT { int[] par; int[] rank; int[] size; int n; int groups; public UFT(int n){ this.n = n; groups = n; par = new int[n]; rank = new int[n]; size = new int[n]; for(int i = 0; i < n; i++){ par[i] = i; rank[i] = 0; size[i] = 1; } } public int root(int x){ if(par[x] == x) return x; else return par[x] = root(par[x]); } public boolean merge(int x, int y){ x = root(x); y = root(y); if(x == y) return false; if(rank[x] < rank[y]){ par[x] = y; size[y] += size[x]; size[x] = 0; } else { par[y] = x; size[x] += size[y]; size[y] = 0; if(rank[x] == rank[y]) rank[x]++; } groups--; return true; } public boolean isSame(int x, int y){ return root(x) == root(y); } public boolean isConnected(){ int s = root(0); if(s == n) return true; else return false; } public int connectedComponents(){ return groups; } public int groupSize(int i){ return size[root(i)]; } } public class Main { static final int INF = 1<<30; static final long INFL = 1L<<60; static final int MOD = 1000000007; static final int MOD2 = 998244353; static List> g; public static void main(String[] args) { FastScanner fs = new FastScanner(); PrintWriter pw = new PrintWriter(System.out); int n = fs.nextInt(); int[] a = new int[n-1]; int[] b = new int[n-1]; long[] c = new long[n-1]; for(int i = 0; i < n-1; i++){ a[i] = fs.nextInt() - 1; b[i] = fs.nextInt() - 1; c[i] = fs.nextLong(); } long ans = 0; for(int i = 0; i < 31; i++){ UFT uft = new UFT(n); for(int j = 0; j < n-1; j++){ if((c[j] & 1L< 0){ uft.merge(a[j], b[j]); } } long cnt = 0; for(int j = 0; j < n; j++){ if(uft.root(j) == j){ long size = (long)uft.size[j] * (uft.size[j] - 1) / 2; size %= MOD; cnt = (cnt + size) % MOD; } } ans = (ans + (cnt * 1L<