#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
struct Node {
int ch[2];
int cnt;
};
const int MAX_N = 200005;
const int MAX_NODES = MAX_N * 32;
Node trie[MAX_NODES];
int node_count = 0;
void reset_trie() {
for (int i = 0; i <= node_count; ++i) {
trie[i].ch[0] = trie[i].ch[1] = 0;
trie[i].cnt = 0;
}
node_count = 0;
}
int new_node() {
node_count++;
trie[node_count].ch[0] = trie[node_count].ch[1] = 0;
trie[node_count].cnt = 0;
return node_count;
}
void insert_trie(ll val) {
int curr = 0;
trie[curr].cnt++;
for (int i = 29; i >= 0; --i) {
int bit = (val >> i) & 1;
if (!trie[curr].ch[bit]) trie[curr].ch[bit] = new_node();
curr = trie[curr].ch[bit];
trie[curr].cnt++;
}
}
ll query_trie(ll val, ll k) {
int curr = 0;
ll res = 0;
for (int i = 29; i >= 0; --i) {
if (curr == -1) break;
int v_bit = (val >> i) & 1;
int k_bit = (k >> i) & 1;
if (k_bit == 1) {
if (trie[curr].ch[v_bit]) res += trie[trie[curr].ch[v_bit]].cnt;
curr = trie[curr].ch[1 - v_bit] ? trie[curr].ch[1 - v_bit] : -1;
} else {
curr = trie[curr].ch[v_bit] ? trie[curr].ch[v_bit] : -1;
}
}
if (curr != -1) res += trie[curr].cnt;
return res;
}
ll basis[31];
void insert_basis(ll x) {
for (int i = 29; i >= 0; --i) {
if (!(x >> i & 1)) continue;
if (!basis[i]) {
basis[i] = x;
return;
}
x ^= basis[i];
}
}
ll minimize(ll x) {
for (int i = 29; i >= 0; --i) {
if ((x >> i & 1) && basis[i]) x ^= basis[i];
}
return x;
}
vector<pair<int, ll>> adj[MAX_N];
ll D[MAX_N];
bool vis[MAX_N];
void dfs(int u, ll cur_xor) {
vis[u] = true;
D[u] = cur_xor;
for (auto& edge : adj[u]) {
int v = edge.first;
ll w = edge.second;
if (!vis[v]) {
dfs(v, cur_xor ^ w);
} else {
insert_basis(D[u] ^ D[v] ^ w);
}
}
}
void solve() {
int n, m;
ll k;
if (!(cin >> n >> m >> k)) return;
for (int i = 1; i <= n; ++i) {
adj[i].clear();
vis[i] = false;
D[i] = 0;
}
for (int i = 0; i < 31; ++i) basis[i] = 0;
reset_trie();
for (int i = 0; i < m; ++i) {
int u, v;
ll w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
dfs(1, 0);
ll ans = 0;
for (int i = 1; i <= n; ++i) {
ll val = minimize(D[i]);
ans += query_trie(val, k);
insert_trie(val);
}
cout << ans << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}