#include <fstream>
#include <iostream>
#include <vector>
#define Nmax 100005
#define pb push_back

using namespace std;

int st[Nmax],dr[Nmax],val[Nmax],n,m,sol[Nmax],s[Nmax];

struct Edge
{
    int nod,tip;
};
vector <Edge> L[Nmax];

int main()
{
    int i,bit;
    Edge w;
    //ifstream cin("date.in");
    //ofstream cout("date.out");
    cin>>n>>m;
    for(i=1;i<=m;++i) cin>>st[i]>>dr[i]>>val[i];
    for(bit=0;bit<=20;++bit)
    {
        for(i=1;i<=m;++i)
        {
            w.tip=(val[i]&(1<<bit));
            w.nod=dr[i]; L[st[i]-1].pb(w);
            w.nod=st[i]-1; L[dr[i]].pb(w);
        }
        for(i=0;i<=n;++i) s[i]=-1;
        for(i=0;i<=n;++i)
        {
            if(s[i]==-1) s[i]=0;
            for(vector <Edge> ::iterator it = L[i].begin();it!=L[i].end();++it)
                if(!(*it).tip)
                {
                    if(s[(*it).nod]!=-1 && s[(*it).nod]!=s[i])
                    {
                        cout<<"-1"; return 0;
                    }
                    else s[(*it).nod]=s[i];
                }
                else
                {
                    if(s[(*it).nod]!=-1 && s[(*it).nod]==s[i])
                    {
                        cout<<"-1"; return 0;
                    }
                    else s[(*it).nod]=1-s[i];
                }
        }
        for(i=1;i<=n;++i)
            if(s[i]!=s[i-1]) sol[i]+=(1<<bit);
        for(i=0;i<=n;++i) L[i].clear();
    }
    for(i=1;i<=n;++i) cout<<sol[i]<<" ";
    return 0;
}