#include <bits/stdc++.h>
using namespace std;
const int max_n = 1e5 + 5;
int n, x = 0, y = 0, sum = 0;
struct Rectangle {
  int l, v, r;
  bool operator<(const Rectangle &tmp) const { return v < tmp.v; }
} c[max_n];
vector<pair<int, int>> add[max_n * 3], ers[max_n * 3];
int tree[max_n * 3 * 4], lazy[max_n * 3 * 4];
inline void Push_Down(int p) {
  tree[2 * p] += lazy[p], tree[2 * p + 1] += lazy[p];
  lazy[2 * p] += lazy[p], lazy[2 * p + 1] += lazy[p];
  lazy[p] = 0;
}
void Change(int p, int l, int r, int L, int R, int d) {
  if (r < L || R < l) return;
  if (L <= l && r <= R) {
    tree[p] += d;
    lazy[p] += d;
    return;
  }
  Push_Down(p);
  int mid = (l + r) / 2;
  Change(2 * p, l, mid, L, R, d), Change(2 * p + 1, mid + 1, r, L, R, d);
  tree[p] = max(tree[2 * p], tree[2 * p + 1]);
}
int Query(int p, int l, int r) {
  if (l == r) return l;
  Push_Down(p);
  int mid = (l + r) / 2;
  if (tree[2 * p] < tree[2 * p + 1])
    return Query(2 * p + 1, mid + 1, r);
  else
    return Query(2 * p, l, mid);
}
int ans[max_n], cnt = 0;
signed main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d %d %d", &c[i].l, &c[i].v, &c[i].r);
  for (int i = 1; i <= n; i++) {
    add[c[i].v].emplace_back(c[i].l, c[i].v);
    ers[c[i].r].emplace_back(c[i].l, c[i].v);
  }
  for (int i = 1; i <= 3e5; i++) {
    for (auto j : add[i]) Change(1, 1, 3e5, j.first, j.second, 1);
    if (tree[1] > sum) x = Query(1, 1, 3e5), y = i, sum = tree[1];
    for (auto j : ers[i]) Change(1, 1, 3e5, j.first, j.second, -1);
  }
  for (int i = 1; i <= n; i++)
    if (c[i].l <= x && x <= c[i].v && c[i].v <= y && y <= c[i].r)
      ans[++cnt] = i;
  printf("%d\n", sum);
  for (int i = 1; i <= cnt; i++) printf("%d ", ans[i]);
  return 0;
}
