#include<iostream> #include<tuple> #include<vector> constexprint N = 5e4 + 5; constexprint M = 1e5 + 5; constexprint B = 63; using i64 = longlong; using pil = std::tuple<int, i64>; using pii = std::tuple<int, int>; using edge = std::tuple<int, i64>; using vpil = std::vector<pil>; using vi = std::vector<int>;
int n, m; vi G[N], T[N]; edge E[M]; int on_tree[M], vis[N]; std::vector<i64> basis; i64 sinceRoot[N];
voidtree(int u, int fa){ vis[u] = true; for (auto eid : G[u]) { auto [uv, w] = E[eid]; int v = uv ^ u; if (v == fa) continue; if (vis[v]) { basis.push_back(w ^ sinceRoot[u] ^ sinceRoot[v]); continue; } sinceRoot[v] = sinceRoot[u] ^ w; on_tree[eid] = 1; T[u].push_back(eid); T[v].push_back(eid); tree(v, u); } }
intmain(){ // std::cin.tie(0)->sync_with_stdio(0); std::cin >> n >> m; for (int i = 1, u, v; i <= m; i++) { i64 w; std::cin >> u >> v >> w; E[i] = {u ^ v, w}; G[u].emplace_back(i), G[v].emplace_back(i); }
tree(1, 0);
// linear basis int row = 0; int len = basis.size(); auto checkbit = [&](i64 x, int b) { return (x >> b) & 1; }; for (int col = B; col >= 0 && row < len; col--) { for (int to = row; to < len; to++) { if (checkbit(basis[to], col)) { std::swap(basis[to], basis[row]); break; } }
if (notcheckbit(basis[row], col)) continue; for (int i = 0; i < len; i++) { if (i == row) continue; if (checkbit(basis[i], col)) basis[i] ^= basis[row]; } row++; }
i64 ans = sinceRoot[n]; for (int i = 0; i < row; i++) if ((ans ^ basis[i]) > ans) ans ^= basis[i]; std::cout << ans << '\n'; }