#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r;
  int val;
} T[4 * 300010];
void build(int id, int l, int r) {
  T[id].l = l, T[id].r = r;
  T[id].val = 0;
  if (l == r)
    return;
  else {
    int mid = (l + r) >> 1;
    build(id << 1, l, mid);
    build(id << 1 | 1, mid + 1, r);
  }
}
void pushdown(int id) {
  if (T[id].val) {
    T[id << 1].val = T[id << 1 | 1].val = T[id].val;
    T[id].val = 0;
  }
}
void update(int id, int L, int R, int c) {
  if (L > R) return;
  if (L <= T[id].l && T[id].r <= R) {
    T[id].val = c;
    return;
  }
  pushdown(id);
  int mid = (T[id].l + T[id].r) >> 1;
  if (mid >= L) update(id << 1, L, R, c);
  if (mid < R) update(id << 1 | 1, L, R, c);
}
int ans;
int query(int id, int x) {
  if (x == ans) return 0;
  if (T[id].l == T[id].r) return T[id].val;
  pushdown(id);
  int mid = (T[id].l + T[id].r) >> 1;
  if (mid >= x) return query(id << 1, x);
  return query(id << 1 | 1, x);
}
int t[300010][3];
int main() {
  int n, m;
  while (scanf("%d %d", &n, &m) != EOF) {
    build(1, 1, n);
    int l, r, x;
    for (int i = 0; i < m; i++) scanf("%d %d %d", &t[i][0], &t[i][1], &t[i][2]);
    for (int i = m - 1; i >= 0; i--) {
      update(1, t[i][0], t[i][2] - 1, t[i][2]);
      update(1, t[i][2] + 1, t[i][1], t[i][2]);
    }
    ans = t[m - 1][2];
    for (int i = 1; i <= n; i++) {
      if (i == n)
        printf("%d\n", query(1, i));
      else
        printf("%d ", query(1, i));
    }
  }
}
