#include using namespace std; using ll=long long; using ull=unsigned long long; #define rep(i,n) for(int i=0; i<(n); i++) struct dsu{ int N; vector V; vector X; dsu(int n=0){ N=n; V.resize(N); rep(i,N) V[i]=i; X.assign(N,0); } int root(int a){ if(V[a]==a) return a; int p=V[a]; int r=root(V[a]); V[a]=r; X[a]^=X[p]; return r; } int merge(int r,int c,int y){ int rr=root(r), rc=root(c); if(rr==rc){ if((X[r]^X[c])!=y) return -1; else return 0; } V[rc]=r; X[rc]=y^X[c]; return 0; } }; int N,M; dsu G; int main(){ scanf("%d%d",&N,&M); G=dsu(N); rep(i,M){ int a,b,y; scanf("%d%d%d",&a,&b,&y); a--; b--; if(G.merge(a,b,y)){ printf("-1\n"); return 0; } } rep(i,N) G.root(i); rep(i,N) printf("%d\n",G.X[i]); return 0; }