#include <bits/stdc++.h>
using namespace std;

#define NDEBUG
#include <cassert>


typedef long long ll;
typedef long double Double;
typedef unsigned long long ull;
typedef pair<int,int> ii;
typedef pair<ll,ll> llll;
typedef pair<double,double> dd;

typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<ii> vii;
typedef vector<vector<ii>> vvii;
typedef vector<ll> vll;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<long double> vD;

#define sz(a)  int((a).size())
#define pb  push_back
#define eb  emplace_back
#define FOR(var,from,to) for(int var=(from);var<=(to);++var)
#define rep(var,n)  for(int var=0;var<(n);++var)
#define rep1(var,n)  for(int var=1;var<=(n);++var)
#define repC2(vari,varj,n)  for(int vari=0;vari<(n)-1;++vari)for(int varj=vari+1;varj<(n);++varj)
#define ALL(c)  (c).begin(),(c).end()
#define RALL(c)  (c).rbegin(),(c).rend()
#define tr(i,c)  for(auto i=(c).begin(); i!=(c).end(); ++i)
#define found(s,e)  ((s).find(e)!=(s).end())
#define mset(arr,val)  memset(arr,val,sizeof(arr))
#define mid(x,y) ((x)+((y)-(x))/2)
#define IN(x,a,b) ((a)<=(x)&&(x)<=(b))
#define cons make_pair

#define PQ(T) priority_queue<T>
#define RPQ(T) priority_queue<T,vector<T>,greater<T>>

template<class T> inline void amin(T & a, T const & b) { a = min(a, b); }
template<class T> inline void amax(T & a, T const & b) { a = max(a, b); }

inline ll square(ll x) { return x * x; }
inline ll gcd(ll a, ll b) { while(a) swap(a, b%=a); return b; }
template <typename T>
inline T mod(T a, T b) { return ((a % b) + b) % b; }


const ll MOD=1000000007LL;

ll ADD(ll x, ll y) { return (x+y) % MOD; }
ll SUB(ll x, ll y) { return (x-y+MOD) % MOD; }
ll MUL(ll x, ll y) { return x*y % MOD; }
ll POW(ll x, ll e) { ll v=1; for(; e; x=MUL(x,x), e>>=1) if (e&1) v = MUL(v,x); return v; }
ll DIV(ll x, ll y) { /*assert(y%MOD!=0);*/ return MUL(x, POW(y, MOD-2)); }

#define INTSPACE 12
char _buf[INTSPACE*1000000 + 3];

int loadint() {
    if (fgets(_buf, INTSPACE+3, stdin)==NULL) return 0;
    return atoi(_buf);
}

int loadvec(vector<int>& v, int N=-1) {
    if (N == 0) {
        v.clear();
        return 0;
    }
    if (N == -1) {
        N = loadint();
        if (N==0) return 0;
    }
    int bufsize = INTSPACE*N + 3;
    if (fgets(_buf, bufsize, stdin)==NULL) return 0;
    v.resize(N);

    int i=0;
    bool last = false;
    for (char *p=&_buf[0]; ;) {
        char *q = p;
        while (*q > ' ') ++q;
        if (*q == 0x0D || *q == 0x0A) last = true;
        *q = 0;
        v[i++] = atoi(p);
        if (last || i == N) break;
        p = q+1;
    }
    return i;
}
void read_cr() {
    fgets(_buf, 256, stdin);
}


struct Segment {
    int depth;
    int first;
    int second;
    Segment(int depth, int first, int second) : depth(depth), first(first), second(second) {
    }
};


class IntervalTree {
public:
    vector<int> stock;
    int N, l, r;

public:
    IntervalTree(int l, int r) {
        this->l = l;
        this->r = r;
        int c=1; while (c < r-l+1) c*=2;
        this->N = c;
        stock.assign(N*2, INT_MAX);
    }
    ~IntervalTree() {}

public:
    void insert(Segment seg) {
        int sl = seg.first - this->l, sr = seg.second - this->l;
        queue<ii> q;
        q.push(ii(0, N));
        while (!q.empty()) {
            int b = q.front().first, w = q.front().second;
            q.pop();
            if (sl <= b && b+w-1 <= sr) {
                int L = N/w, i = b/w;
                amin(stock[L+i], seg.depth);
                continue;
            }
            if (w == 1) continue;
            int m = w/2;
            if (sl < b+m) {
                q.push(ii(b, m));
            }
            if (b+m <= sr) {
                q.push(ii(b+m, m));
            }
        }
    }

    int search(int p) {
        int res = INT_MAX;

        if (p < l || r < p) return res;
        p -= l;

        for (int w=1,i=0,m=N; m>=1; w*=2,m/=2,i*=2) {
            if (p & m) {
                ++i;
                p -= m;
            }
            amin(res, stock[w+i]);
            /*
            for (int j=0; j<stock[w+i].size(); ++j) {

            }
            */
        }
        return res;
    }
    void dump() {
#if 0
        printf("[%d..%d, N=%d]", l, r, N);
        for (int w=1; w<=N; w*=2) {
            for (int i=0; i<w; ++i) {
                int x = N/w;
                printf("%d %d [%d..%d] ", w, i, x*i, x*(i+1)-1);
                cout << stock[w+i] << endl;
            }
        }
#endif
    }
};



void solve(int N,int Q,vi& s,vi& t,vi& x,vi& d) {
    rep(i,N) {
        s[i] -= x[i];
        t[i] -= x[i];
        t[i]--;
    }
    set<int> app;
    rep(i,N) app.insert(s[i]);
    rep(i,N) app.insert(t[i]);
    rep(i,N) app.insert(x[i]);
    rep(i,Q) app.insert(d[i]);
    map<int,int> mp; int id=0;
    vi rev;
    vi tmp(ALL(app));
    for (int a:tmp){
        mp[a] = id++;
        rev.pb(a);
    }
    rep(i,N) s[i] = mp[s[i]];
    rep(i,N) t[i] = mp[t[i]];
    rep(i,N) x[i] = mp[x[i]];
    rep(i,Q) d[i] = mp[d[i]];

    IntervalTree it(0, id+1);
    rep(i,N){
        it.insert(Segment(x[i], s[i], t[i]));
    }
    rep(i,Q){
        int a = it.search(d[i]);
        if (a == INT_MAX) a = -1;
        else a = rev[a];
        printf("%d\n", a);
    }
}

int main() {
    int N, Q; scanf("%d %d%*c", &N, &Q);
    vi s(N),t(N),x(N);
    rep(i,N) {
        scanf("%d %d %d%*c", &s[i], &t[i], &x[i]);
    }
    vi d(Q);
    rep(i,Q) {
        scanf("%d%*c", &d[i]);
    }
    solve(N,Q,s,t,x,d);
    return 0;
}


Measured memory_bytes: 93804