#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r, c, t;
  int mid() { return (l + r) >> 1; }
} T[300005 << 2];
void build(int l, int r, int cur) {
  T[cur].l = l;
  T[cur].r = r;
  T[cur].c = T[cur].t = 0;
  if (l == r) return;
  build(l, T[cur].mid(), cur * 2);
  build(T[cur].mid() + 1, r, cur * 2 + 1);
}
void update(int l, int r, int cur, int v, int t) {
  if (l > r) return;
  if (T[cur].l == l && T[cur].r == r) {
    if (T[cur].t < t) {
      T[cur].t = t;
      T[cur].c = v;
    }
    return;
  }
  int m = T[cur].mid();
  if (r <= m)
    update(l, r, 2 * cur, v, t);
  else if (l > m)
    update(l, r, 2 * cur + 1, v, t);
  else {
    update(l, m, 2 * cur, v, t);
    update(m + 1, r, 2 * cur + 1, v, t);
  }
}
int query(int l, int cur, int c, int t) {
  if (T[cur].l == l && T[cur].r == l) {
    if (T[cur].t > t) return T[cur].c;
    return c;
  }
  int m = T[cur].mid();
  if (T[cur].t > t) c = T[cur].c;
  if (l <= m)
    return query(l, 2 * cur, c, max(T[cur].t, t));
  else
    return query(l, 2 * cur + 1, c, max(T[cur].t, t));
}
int L[300005], R[300005], x[300005];
int main() {
  int n, m, t = 1;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++) scanf("%d%d%d", &L[i], &R[i], &x[i]);
  build(1, n, 1);
  for (int i = m - 1; i >= 0; i--, t++) {
    update(L[i], x[i] - 1, 1, x[i], t);
    update(x[i] + 1, R[i], 1, x[i], t);
  }
  for (int i = 1; i <= n; i++)
    printf("%d%c", query(i, 1, 0, 0), i == n ? '\n' : ' ');
  return 0;
}
