#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>

using namespace std;

#define NMAX 131072

int sum[2 * NMAX];

void Update(int poz, int val) {
	poz = NMAX + poz - 1;
	while (poz >= 1) {
		sum[poz] ^= val;
		poz >>= 1;
	}
}

int Query(int poz) {
	int ans = 0;
	if (poz <= 0)
		return 0;
	poz = NMAX + poz - 1;
	while (poz > 1) {
		if (poz & 1)
			ans ^= sum[poz - 1];
		poz >>= 1;
	}
	return ans;
}

vector<pair<int, int> > vv[NMAX];
int N, M, x, y, val, i, j;

int main() {
	scanf("%d %d", &N, &M);
	while (M--) {
		scanf("%d %d %d", &x, &y, &val);
		vv[y].push_back(make_pair(x, val));
	}

	for (i = N; i >= 1; i--) {
		if (vv[i].size() == 0)
			continue;
		sort(vv[i].begin(), vv[i].end());
		for (j = 0; j + 1 < vv[i].size(); j++) {
			x = vv[i][j].first;
			y = vv[i][j + 1].first;
			if (x == y)
				continue;
			vv[y - 1].push_back(make_pair(x, vv[i][j].second ^ vv[i][j + 1].second));
		}
		pair<int, int> pp = vv[i][vv[i].size() - 1];
		vv[i].clear();
		vv[i].push_back(pp);
	}

	memset(sum, 0, sizeof(sum));
	for (i = 1; i <= N; i++)
		if (vv[i].size() > 0) {
			x = vv[i][0].first;
			val = vv[i][0].second;
			y = Query(i) ^ Query(x);
			//fprintf(stderr, "i=%d: x=%d y=%d val=%d\n", i, x, y, val);
			Update(i, y ^ val);
		}

	for (i = 1; i <= N; i++)
		printf("%d ", sum[NMAX + i - 1]);
	printf("\n");
	return 0;
}