环^链=链,所以找到一条从1到n的路径和很多很多环,这时候就可以任意异或了,异或和最大,然后用到线性基。
#include<cstdio>
#include<cstring>
#include<iostream>
#define cmax(a,b) ((b)>(a)?a=(b):1)
#define LL long long
#define maxn 200020
using namespace std;
int n,m,head[maxn],tot,ins[maxn],cnt;
LL ans,d[maxn],cir[maxn];
bool vis[maxn];
struct edge{int v,next;LL w;}e[maxn];
void adde(int a,int b,LL c){e[tot].v=b,e[tot].next=head[a],e[tot].w=c;head[a]=tot++;}
void dfs(int u,int fa){
vis[u]=true;
for(int v,i=head[u];i!=-1;i=e[i].next ){
v=e[i].v;if(v==fa)continue;
if(!vis[v]){
d[v]=d[u]^e[i].w;
dfs(v,u);
}else cir[++cnt]=d[u]^d[v]^e[i].w;
}
}
void solve(){
for(int i=1;i<=cnt;i++){
for(int j=63;j>=0;j--)if((cir[i]>>j)&1){
if(!ins[j]){ins[j]=i;break;}
else cir[i]^=cir[ins[j]];
}
}
ans=d[n];
for(int i=63;i>=0;i--){
cmax(ans,ans^cir[ins[i]]);
}
printf("%lld",ans);
}
int main(){
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
int a,b;LL c;
for(int i=1;i<=m;i++){
scanf("%d%d%lld",&a,&b,&c);
adde(a,b,c),adde(b,a,c);
}
dfs(1,1);
solve();
return 0;
}