#include <iostream>
#include <fstream>
#include <string.h>
#include <algorithm>
#include <fstream>
#include <bitset>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <utility>
#include <string>
#include <cmath>
#include <iomanip>
#include <cstring>

#define vint vector<int>::iterator
#define vintp vector<pair<int,int> >::iterator
#define inf 1000000
#define ll long long
#define maxn 100010
#define mod 1000000007

using namespace std;

ifstream fin ("A.in");
ofstream fout("A.out");

int n,l,r,wh,m,maxv;
int x[100001],y[100001],v[100001],fina[100001];
int arb[400001];
int aib[400001];

int LSB (int i)
{
    return i&-i;
}

int query (int i)
{
    int s = 0;

    for (; i>0; i-= LSB(i))
    {
        s ^= aib[i];
    }

    return s;
}

void update (int i, int val)
{
    for (; i<=n; i += LSB(i))
    {
        aib[i] ^= val;
    }
}


void set_arb (int node, int left, int right)
{
    if (left == right)
    {
        arb[node] = left;
        return;
    }

    int mid = (left + right)/2;

    set_arb (node*2,left,mid);
    set_arb(node*2+1,mid+1,right);

    arb[node] = arb[node*2];
}

void update_arb (int node, int left, int right)
{
    if (l <= left && right <= r)
    {
        arb[node] = 0;
        return;
    }

    int mid = (left+right)/2;

    if (l <= mid && arb[node*2])
        update_arb (node*2,left,mid);
    if (r > mid && arb[node*2+1])
        update_arb (node*2+1,mid+1,right);

    arb[node] = max (arb[node*2],arb[node*2+1]);
}


void query_arb (int node, int left, int right)
{
    if (l <= left && right <= r)
    {
        wh = arb[node];
        return;
    }

    int mid = (left + right)/2;

    if (l <= mid && arb[node*2])
        query_arb (node*2,left,mid);
    if (r > mid && arb[node*2+1])
        query_arb (node*2+1,mid+1,right);
}

int main ()
{
    cin>>n>>m;

    for (int i=1; i<=m; ++i)
    {
        cin>>x[i]>>y[i]>>v[i];
        maxv = log2(v[i]);
    }


        set_arb (1,1,n);
        memset (aib,0,sizeof(aib));

        for (int i=1; i<=m; ++i)
        {
            l = x[i]; r = y[i];
            wh=0;

            int val = (query(y[i]) ^ query(x[i]-1));

            if ((val^v[i]) != 0)
            {
                int upd = val^v[i];
                query_arb(1,1,n);
                if (wh != 0) update (wh,upd);
                fina[wh] ^= upd;
            }

            update_arb (1,1,n);
        }

    for (int i=1; i<=n; ++i)
    {
        cout<<fina[i]<<" ";
    }
}