#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cmath>
using namespace std;
#define int long long
typedef pair<int, int> P;
#define rep(i, n) for (int i=0; i<(n); i++)
#define all(c) (c).begin(), (c).end()
#define uniq(c) c.erase(unique(all(c)), (c).end())
#define _1 first
#define _2 second
#define pb push_back
#define INF 1145141919
#define MOD 1000000007
long long X;
int N;
vector<P> G[100000];
bool centroid[100000];
int subtree_size[100000];
int compute_subtree_size(int v, int prev) {
int c = 1;
for (int i=0; i<G[v].size(); i++) {
int t = G[v][i].first;
if (t == prev || centroid[t]) continue;
c += compute_subtree_size(t, v);
}
return subtree_size[v] = c;
}
P search_centroid(int v, int prev, int t) {
P ret = P(INF, -1);
int s = 1, m = 0;
for (int i=0; i<G[v].size(); i++) {
int w = G[v][i].first;
if (w == prev || centroid[w]) continue;
ret = min(ret, search_centroid(w, v, t));
m = max(m, subtree_size[w]);
s += subtree_size[w];
}
m = max(m, t - s);
ret = min(ret, P(m, v));
return ret;
}
void enumerate_paths(int v, int prev, int d, vector<int> &ds) {
ds.push_back(d);
for (int i=0; i<G[v].size(); i++) {
int w = G[v][i].first;
if (w == prev || centroid[w]) continue;
enumerate_paths(w, v, d ^ G[v][i].second, ds);
}
}
int count_pairs(vector<int> &ds) {
map<int, int> m;
for (int x : ds) m[x]++;
int ctr = 0;
for (auto &p : m) {
int t = p._1 ^ X;
if (p._1 == t) {
ctr += (p._2) * (p._2-1);
}
else {
if (m.find(t) != m.end()) ctr += (p._2) * m[t];
}
}
m.clear();
return ctr/2;
}
// 頂点vが属する部分木がいくつ有効なペアを持っているか
int solve_subproblem(int v) {
int ret = 0;
compute_subtree_size(v, -1);
int s = search_centroid(v, -1, subtree_size[v]).second;
centroid[s] = true;
// [1] { a,b } <- s
for (int i=0; i<G[s].size(); i++) {
int w = G[s][i].first;
if (centroid[w]) continue;
ret += solve_subproblem(w);
}
// [2] { a } <- s -> { b }
// [3] { a } <- s=b
// 頂点sを通る頂点の組に関して数える
vector<int> ds;
ds.push_back(0);
for (int i=0; i<G[s].size(); i++) {
int w = G[s][i].first;
if (centroid[w]) continue;
vector<int> tds;
enumerate_paths(w, s, G[s][i].second, tds);
ret -= count_pairs(tds); // 重複分をあらかじめ引いておく
ds.insert(ds.end(), tds.begin(), tds.end()); // append
}
ret += count_pairs(ds);
centroid[s] = false;
return ret;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> N >> X;
for (int i=0; i<N-1; i++) {
int u, v, l;
cin >> u >> v >> l;
G[u-1].push_back(P(v-1, l));
G[v-1].push_back(P(u-1, l));
}
cout << solve_subproblem(0) << "\n";
return 0;
}