class Solution {
int find(int x, vector<int> &parent, vector<int> &xr) {
if (parent[x] == x)
return x;
int p = parent[x];
parent[x] = find(parent[x], parent, xr);
xr[x] ^= xr[p];
return parent[x];
}
public:
int numberOfEdgesAdded(int n, vector<vector<int>> &edges) {
vector<int> parent(n), xr(n, 0), rnk(n, 0);
for (int i = 0; i < n; ++i)
parent[i] = i;
int added = 0;
for (const auto &e : edges) {
int u = e[0], v = e[1], w = e[2];
int ru = find(u, parent, xr);
int rv = find(v, parent, xr);
if (ru == rv) {
if ((xr[u] ^ xr[v]) == w)
++added;
continue;
}
if (rnk[ru] < rnk[rv]) {
parent[ru] = rv;
xr[ru] = xr[u] ^ xr[v] ^ w;
} else if (rnk[ru] > rnk[rv]) {
parent[rv] = ru;
xr[rv] = xr[u] ^ xr[v] ^ w;
} else {
parent[rv] = ru;
xr[rv] = xr[u] ^ xr[v] ^ w;
++rnk[ru];
}
++added;
}
return added;
}
};