#include <bits/stdc++.h>
using namespace std;
int n, Kakat;
int tata[100005], dist[100005], vv[100005];
vector<int> Aux;
queue<int> Q, QQ;
struct el {
  int a, b, c, d, ind;
  bool operator<(const el A) const { return a < A.a; }
} v[100005];
struct Node {
  vector<int> v;
  int p = 0;
} aint[4 * 100005];
inline void Afisare() {
  int i, l = 0;
  for (i = Kakat; i; i = tata[i]) vv[++l] = v[i].ind;
  cout << l << "\n";
  for (i = l; i; --i) cout << vv[i] << " ";
}
inline bool cmp(const int x, const int y) { return v[x].b < v[y].b; }
inline void Build(int nod, int st, int dr) {
  if (st == dr) {
    aint[nod].v.push_back(st);
    return;
  }
  int mij = ((st + dr) >> 1);
  Build(2 * nod, st, mij);
  Build(2 * nod + 1, mij + 1, dr);
  Aux.resize(aint[2 * nod].v.size() + aint[2 * nod + 1].v.size());
  merge(aint[2 * nod].v.begin(), aint[2 * nod].v.end(),
        aint[2 * nod + 1].v.begin(), aint[2 * nod + 1].v.end(), Aux.begin(),
        cmp);
  aint[nod].v.resize(Aux.size());
  copy(Aux.begin(), Aux.end(), aint[nod].v.begin());
  Aux.clear();
}
inline void solve(int nod, int st, int dr, int x, int y, int val) {
  if (st == x && y == dr) {
    for (; aint[nod].p < aint[nod].v.size() &&
           v[aint[nod].v[aint[nod].p]].b <= val;
         QQ.push(aint[nod].v[aint[nod].p]), ++aint[nod].p)
      ;
    return;
  }
  int mij = ((st + dr) >> 1);
  if (y <= mij)
    solve(2 * nod, st, mij, x, y, val);
  else if (x > mij)
    solve(2 * nod + 1, mij + 1, dr, x, y, val);
  else {
    solve(2 * nod, st, mij, x, mij, val);
    solve(2 * nod + 1, mij + 1, dr, mij + 1, y, val);
  }
}
inline int CB(int x) {
  int st = 1, dr = n, mij, sol = -1;
  while (st <= dr) {
    mij = ((st + dr) >> 1);
    if (v[mij].a <= x) {
      sol = mij;
      st = mij + 1;
    } else
      dr = mij - 1;
  }
  return sol;
}
int main() {
  int i, j;
  cin.sync_with_stdio(0);
  cin >> n;
  for (i = 1; i <= n; ++i) {
    cin >> v[i].a >> v[i].b >> v[i].c >> v[i].d;
    v[i].ind = i;
    dist[i] = 1000000000;
  }
  sort(v + 1, v + n + 1);
  Build(1, 1, n);
  Q.push(0);
  while (!Q.empty()) {
    int nod = Q.front();
    Q.pop();
    if (v[nod].ind == n) {
      Kakat = nod;
      Afisare();
      return 0;
    }
    int p = CB(v[nod].c);
    if (p == -1) continue;
    while (!QQ.empty()) QQ.pop();
    solve(1, 1, n, 1, p, v[nod].d);
    while (!QQ.empty()) {
      int it = QQ.front();
      QQ.pop();
      if (dist[it] > dist[nod] + 1) {
        dist[it] = dist[nod] + 1;
        tata[it] = nod;
        Q.push(it);
      }
    }
  }
  cout << "-1";
  return 0;
}
