#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
const int mod = 1e9 + 7;
int read() {
  int x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + c - '0', c = getchar();
  return x * f;
}
const int SEN = 3e5 + 10;
struct segmentTree {
  pair<int, int> maxx[SEN << 2];
  int lazy[SEN << 2];
  void addtag(int pos, int l, int r, int w) {
    lazy[pos] += w;
    maxx[pos].first += w;
  }
  void pushdown(int pos, int l, int r) {
    if (lazy[pos]) {
      int w = lazy[pos];
      int mid = (l + r) >> 1;
      addtag(pos << 1, l, mid, w);
      addtag(pos << 1 | 1, mid + 1, r, w);
      lazy[pos] = 0;
    }
  }
  void pushup(int pos) { maxx[pos] = max(maxx[pos << 1 | 1], maxx[pos << 1]); }
  pair<int, int> query(int ql, int qr, int pos, int l, int r) {
    if (ql <= l && r <= qr) {
      return maxx[pos];
    }
    pushdown(pos, l, r);
    int mid = (l + r) >> 1;
    pair<int, int> ans = make_pair(0, 0);
    if (ql <= mid) ans = max(ans, query(ql, qr, pos << 1, l, mid));
    if (qr > mid) ans = max(ans, query(ql, qr, pos << 1 | 1, mid + 1, r));
    return ans;
  }
  void update(int ql, int qr, int w, int pos, int l, int r) {
    if (ql <= l && r <= qr) {
      addtag(pos, l, r, w);
      return;
    }
    pushdown(pos, l, r);
    int mid = (l + r) >> 1;
    if (ql <= mid) update(ql, qr, w, pos << 1, l, mid);
    if (qr > mid) update(ql, qr, w, pos << 1 | 1, mid + 1, r);
    pushup(pos);
  }
  void build(int pos, int l, int r) {
    if (l == r) {
      maxx[pos].second = l;
      return;
    }
    int mid = (l + r) >> 1;
    build(pos << 1, l, mid);
    build(pos << 1 | 1, mid + 1, r);
    pushup(pos);
  }
} T;
struct Seg {
  int l, r, op;
};
vector<Seg> g[N][2];
pair<int, int> ans = make_pair(0, 0);
int l[N], r[N], v[N];
int main() {
  int n = read();
  int mx = 0;
  for (int i = 1; i <= n; i++) {
    l[i] = read(), v[i] = read(), r[i] = read();
    g[l[i]][0].push_back((Seg){v[i], r[i], 1});
    g[v[i]][1].push_back((Seg){v[i], r[i], -1});
    mx = max(r[i], mx);
  }
  T.build(1, 1, mx);
  int ansy = 0;
  for (int i = 1; i < N; i++) {
    for (Seg now : g[i][0]) {
      T.update(now.l, now.r, now.op, 1, 1, mx);
    }
    pair<int, int> now = T.query(1, mx, 1, 1, mx);
    if (now.first > ans.first) ans = now, ansy = i;
    for (Seg now : g[i][1]) {
      T.update(now.l, now.r, now.op, 1, 1, mx);
    }
  }
  printf("%d\n", ans.first);
  for (int i = 1; i <= n; i++)
    if (l[i] <= ansy && ansy <= v[i] && v[i] <= ans.second &&
        ans.second <= r[i])
      printf("%d ", i);
  printf("\n");
}
