#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
const int N = 1e5 + 7;
const int MOD = 1e9 + 7;
int ans[N];
vector<int> v;
int getid(int x) { return lower_bound(v.begin(), v.end(), x) - v.begin() + 1; }
struct tree {
  int l, r, mid;
  int rx;
  int idx;
} t[N << 3];
struct node {
  int l, r, t;
  int id;
  bool operator<(const node &p) const {
    if (l == p.l) return id < p.id;
    return l < p.l;
  }
} g[N << 1];
void pushup(int rt) { t[rt].rx = max(t[rt << 1].rx, t[rt << 1 | 1].rx); }
void build(int l, int r, int rt) {
  int m = (l + r) >> 1;
  t[rt].l = l, t[rt].r = r;
  t[rt].mid = m;
  if (l == r) {
    t[rt].rx = -INF;
    return;
  }
  build(l, m, rt << 1);
  build(m + 1, r, rt << 1 | 1);
  pushup(rt);
}
void update(int pos, int id, int flag, int rt) {
  if (t[rt].l == t[rt].r) {
    t[rt].rx = flag;
    t[rt].idx = id;
    return;
  }
  if (pos <= t[rt].mid) update(pos, id, flag, rt << 1);
  if (pos > t[rt].mid) update(pos, id, flag, rt << 1 | 1);
  pushup(rt);
}
int query(int p, int flag, int rt) {
  if (t[rt].rx < flag) return -1;
  if (t[rt].l == t[rt].r) return t[rt].idx;
  int ans = -1;
  if (p <= t[rt].mid) {
    ans = query(p, flag, rt << 1);
    if (ans > 0) return ans;
  }
  return query(p, flag, rt << 1 | 1);
}
int n, m;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n + m; i++) {
    scanf("%d%d%d", &g[i].l, &g[i].r, &g[i].t);
    g[i].id = i;
    v.push_back(g[i].t);
  }
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
  build(1, (int)v.size(), 1);
  sort(g + 1, g + 1 + m + n);
  for (int i = 1; i <= n + m; i++) {
    int pos = getid(g[i].t);
    if (g[i].id <= n)
      update(pos, g[i].id, g[i].r, 1);
    else
      ans[g[i].id - n] = query(pos, g[i].r, 1);
  }
  for (int i = 1; i <= m; i++) {
    printf("%d", ans[i]);
    if (i != m) printf(" ");
  }
  printf("\n");
}
