#include <bits/stdc++.h>
using namespace std;
const int NMAX = 300010;
int N, L[NMAX], V[NMAX], R[NMAX], AnsMax, AnsL, AnsR, MaxR;
struct SegTree {
  int Max, PosMax, Add;
} Aint[4 * NMAX];
struct Ev {
  int Type, X, LB, RB;
  Ev(int _Type, int _X, int _LB, int _RB) {
    Type = _Type;
    X = _X;
    LB = _LB;
    RB = _RB;
  }
};
struct Comp {
  bool operator()(const Ev &E1, const Ev &E2) const {
    if (E1.X != E2.X) return E1.X < E2.X;
    return E1.Type < E2.Type;
  }
};
vector<Ev> E;
vector<int> Ans;
void Build(int Node, int Left, int Right) {
  Aint[Node].Add = 0;
  Aint[Node].Max = 0;
  Aint[Node].PosMax = Left;
  if (Left == Right) return;
  int Mid = (Left + Right) / 2;
  Build((2 * Node), Left, Mid);
  Build((2 * Node + 1), Mid + 1, Right);
}
void Update(int Node, int Left, int Right, int LeftB, int RightB, int Val) {
  if (LeftB <= Left && Right <= RightB) {
    Aint[Node].Add += Val;
    return;
  }
  int Mid = (Left + Right) / 2;
  if (Aint[Node].Add) {
    Update((2 * Node), Left, Mid, Left, Mid, Aint[Node].Add);
    Update((2 * Node + 1), Mid + 1, Right, Mid + 1, Right, Aint[Node].Add);
    Aint[Node].Add = 0;
  }
  if (LeftB <= Mid) Update((2 * Node), Left, Mid, LeftB, RightB, Val);
  if (Mid < RightB) Update((2 * Node + 1), Mid + 1, Right, LeftB, RightB, Val);
  if (Aint[(2 * Node)].Max + Aint[(2 * Node)].Add >
      Aint[(2 * Node + 1)].Max + Aint[(2 * Node + 1)].Add) {
    Aint[Node].Max = Aint[(2 * Node)].Max + Aint[(2 * Node)].Add;
    Aint[Node].PosMax = Aint[(2 * Node)].PosMax;
  } else {
    Aint[Node].Max = Aint[(2 * Node + 1)].Max + Aint[(2 * Node + 1)].Add;
    Aint[Node].PosMax = Aint[(2 * Node + 1)].PosMax;
  }
}
int main() {
  scanf("%i", &N);
  for (int i = 1; i <= N; ++i) {
    scanf("%i %i %i", &L[i], &V[i], &R[i]);
    MaxR = max(MaxR, R[i]);
    E.push_back(Ev(0, L[i], V[i], R[i]));
    E.push_back(Ev(1, V[i], V[i], R[i]));
  }
  sort(E.begin(), E.end(), Comp());
  Build(1, 1, MaxR);
  for (int i = 0; i < E.size(); ++i) {
    if (E[i].Type == 0)
      Update(1, 1, MaxR, E[i].LB, E[i].RB, 1);
    else
      Update(1, 1, MaxR, E[i].LB, E[i].RB, -1);
    if (Aint[1].Max + Aint[1].Add > AnsMax)
      AnsMax = Aint[1].Max + Aint[1].Add, AnsL = E[i].X, AnsR = Aint[1].PosMax;
  }
  for (int i = 1; i <= N; ++i)
    if (L[i] <= AnsL && AnsL <= V[i] && V[i] <= AnsR && AnsR <= R[i])
      Ans.push_back(i);
  printf("%i\n", Ans.size());
  for (int i = 0; i < Ans.size(); ++i) printf("%i ", Ans[i]);
}
