using namespace std;
#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <algorithm>
#define score 100
#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair
#define IN "bazaconii.in"
#define OUT "bazaconii.out"
#define N_MAX 1<<14
typedef pair<int,int> pi;
int T,N,M;
bool solutie;
vector< pair<pi,ll> > V(N_MAX);
vector< vector<int> > A(N_MAX);
bool viz[N_MAX],BIT[N_MAX][35];
ll S[N_MAX];
II void scan()
{
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d",&T);
}
II void read()
{
int x,y;
ll cc;
scanf("%d %d\n",&N,&M);
FOR(i,1,M)
{
scanf("%d %d %lld\n",&x,&y,&cc);
if(x>y)
swap(x,y);
V[i] = mp( mp(x,y),cc );
}
}
II void DF(int nod,int K,bool type)
{
BIT[nod][K] = type;
int l = A[nod].sz()-1;
FOR(i,0,l)
{
int fiu = A[nod][i];
if(!viz[fiu])
{
viz[fiu] = true;
DF(fiu,K,!type);
}
}
}
II void solve()
{
CC(BIT);
CC(S);
solutie = true;
for(int bit = 32;bit >= 1;--bit)
{
FOR(i,1,M)
{
ll val = V[i].s;
int x = V[i].f.f;
int y = V[i].f.s;
if(val & (ll)(1<<(bit-1)) )
{
A[x].pb(y);
A[y].pb(x);
}
}
FOR(i,1,N)
if(A[i].sz() )
{
viz[i] = true;
DF(i,bit,false);
break;
}
FOR(i,1,N)
A[i].resize(0);
CC(viz);
}
FOR(i,1,N)
FOR(j,1,32)
if(BIT[i][j] == true)
S[i] += 1<<(j-1);
FOR(i,1,M)
{
ll val = V[i].s;
int x = V[i].f.f;
int y = V[i].f.s;
if(val != (ll)(S[x] ^ S[y]) )
{
solutie = false;
break;
}
}
if(!solutie)
printf("-1\n");
else
{
FOR(i,1,N-1)
printf("%lld ",S[i]);
printf("%lld\n",S[N]);
}
}
int main()
{
scan();
for(++T;--T;)
{
read();
solve();
}
return 0;
}