#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
struct node {
  int l, r, s, f, t, id;
} a[maxn << 2];
struct bus {
  int s, f, t, id;
  bool operator<(const bus &x) const { return t < x.t; }
} b[maxn];
int n, m;
int out[maxn];
void pushup(int k) {
  a[k].s = min(a[k << 1].s, a[k << 1 | 1].s);
  a[k].f = max(a[k << 1].f, a[k << 1 | 1].f);
  a[k].t = max(a[k << 1].t, a[k << 1 | 1].t);
}
void build(int pl, int pr, int k) {
  a[k].l = pl, a[k].r = pr;
  if (pl == pr) {
    a[k].s = b[pl].s;
    a[k].f = b[pl].f;
    a[k].t = b[pl].t;
    a[k].id = b[pl].id;
    return;
  }
  int mid = (pl + pr) >> 1;
  build(pl, mid, k << 1);
  build(mid + 1, pr, k << 1 | 1);
  pushup(k);
}
int ans;
int query(int l, int r, int bt, int k) {
  int flag = 0;
  if (a[k].l == a[k].r) {
    if (a[k].s <= l && r <= a[k].f && a[k].t >= bt) {
      ans = a[k].id;
      return 1;
    } else
      return 0;
  }
  int k1 = k << 1, k2 = k << 1 | 1;
  if (a[k1].s <= l && r <= a[k1].f && a[k1].t >= bt)
    flag = query(l, r, bt, k << 1);
  if (!flag && a[k2].s <= l && r <= a[k2].f && a[k2].t >= bt)
    flag = query(l, r, bt, k << 1 | 1);
  return flag;
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &b[i].s, &b[i].f, &b[i].t);
    b[i].id = i;
  }
  sort(b + 1, b + n + 1);
  build(1, n, 1);
  for (int i = 1; i <= m; i++) {
    int l, r, bt;
    scanf("%d%d%d", &l, &r, &bt);
    int flag = query(l, r, bt, 1);
    out[i] = flag ? ans : -1;
  }
  for (int i = 1; i <= m; i++) {
    if (i == 1)
      cout << out[i];
    else
      printf(" %d", out[i]);
  }
}
