#include <bits/stdc++.h>
using namespace std;
int n, viz[100005], sol[100005], TATA, prv[100005];
struct el {
  int a, b, c, d, ind;
  bool operator<(const el &A) const {
    if (a == A.a) return ind < A.ind;
    return a < A.a;
  }
} a[100005];
vector<pair<int, int> > aint[4 * 100005];
int p[4 * 100005];
queue<int> Q;
inline void build(int nod, int st, int dr) {
  if (st == dr) {
    aint[nod].push_back(make_pair(a[st].b, st));
    return;
  }
  int mij = ((st + dr) >> 1);
  build(2 * nod, st, mij);
  build(2 * nod + 1, mij + 1, dr);
  aint[nod].resize(aint[2 * nod].size() + aint[2 * nod + 1].size() + 1);
  merge(aint[2 * nod].begin(), aint[2 * nod].end(), aint[2 * nod + 1].begin(),
        aint[2 * nod + 1].end(), aint[nod].begin());
}
inline void upd(int nod, int st, int dr, int x, int y, int b, int val) {
  if (st == x && y == dr) {
    for (; p[nod] < aint[nod].size() && aint[nod][p[nod]].first <= b;
         ++p[nod]) {
      if (viz[aint[nod][p[nod]].second]) continue;
      viz[aint[nod][p[nod]].second] = 1;
      sol[aint[nod][p[nod]].second] = val;
      prv[aint[nod][p[nod]].second] = TATA;
      Q.push(aint[nod][p[nod]].second);
    }
    return;
  }
  int mij = ((st + dr) >> 1);
  if (y <= mij)
    upd(2 * nod, st, mij, x, y, b, val);
  else if (x > mij)
    upd(2 * nod + 1, mij + 1, dr, x, y, b, val);
  else {
    upd(2 * nod, st, mij, x, mij, b, val);
    upd(2 * nod + 1, mij + 1, dr, mij + 1, y, b, val);
  }
}
inline int CB(int x) {
  int st = 1, dr = n, mij, sol;
  while (st <= dr) {
    mij = ((st + dr) >> 1);
    if (a[mij].a <= x) {
      sol = mij;
      st = mij + 1;
    } else
      dr = mij - 1;
  }
  return sol;
}
inline void Afis(int p) {
  if (p == 1) return;
  Afis(prv[p]);
  cout << a[p].ind - 1 << " ";
}
int main() {
  int i, j, nod;
  cin.sync_with_stdio(0);
  cin >> n;
  ++n;
  a[1].a = a[1].b = a[1].c = a[1].d = 0;
  a[1].ind = 1;
  viz[1] = 1;
  for (i = 2; i <= n; ++i) {
    cin >> a[i].a >> a[i].b >> a[i].c >> a[i].d;
    a[i].ind = i;
  }
  sort(a + 1, a + n + 1);
  build(1, 1, n);
  Q.push(1);
  while (!Q.empty()) {
    nod = Q.front();
    Q.pop();
    el w;
    int poz = CB(a[nod].c);
    TATA = nod;
    upd(1, 1, n, 1, poz, a[nod].d, sol[nod] + 1);
  }
  for (i = 1; i <= n; ++i)
    if (a[i].ind == n) {
      if (!viz[i])
        cout << "-1\n";
      else {
        cout << sol[i] << "\n";
        Afis(i);
      }
    }
  return 0;
}
