#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <limits.h>
#include <math.h>
#include <functional>
#include <bitset>
#include <iomanip>
#include <cassert>
#include <float.h>
#include <random>

#define debug(x) cerr << #x << ": " << x << '\n'
#define debugArray(x,n) for(long long hoge = 0; (hoge) < (n); ++ (hoge)) cerr << #x << "[" << hoge << "]: " << x[hoge] << '\n'
#define debugArrayP(x,n) for(long long hoge = 0; (hoge) < (n); ++ (hoge)) cerr << #x << "[" << hoge << "]: " << x[hoge].first<< " " << x[hoge].second << '\n'

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> Pll;
typedef vector<ll> vll;
const ll INF = LLONG_MAX/10;
const ll MOD = 1e9+7;

template<typename T>
struct delay_segtree {
private:
    int N;
    vector<T> node, lazy;
    //-------書くとこ---------------------
    //例外値　ex)INF,0
    T init_value = INF;//初期値
    T default_value = INF;//単位元
    T default_lazy = INF;
    static inline T merge(const T& u, const T& v) {
        return min(u,v);
    }
    static inline void lazy_transmit(T& u, const T& v) {
        u = min(u,v);
    }
    static inline void node_transmit(T& u,const T& v,int l,int r){
        u = min(u,v);
    }
    //------------------------------------
    // k 番目のノードについて遅延評価を行う
    void eval(int k, int l, int r) {
        // 遅延配列が空でない場合、自ノード及び子ノードへの
        // 値の伝播が起こる
        if (lazy[k] != default_lazy) {
            node_transmit(node[k], lazy[k],l,r);
            // 最下段かどうかのチェックをしよう
            if (r - l > 1) {
                lazy_transmit(lazy[2 * k + 1], lazy[k]);
                lazy_transmit(lazy[2 * k + 2], lazy[k]);
            }
            // 伝播が終わったので、自ノードの遅延配列を空にする
            lazy[k] = default_lazy;
        }
    }
public:
    delay_segtree(int n) {
        for(N=1;N<n;N*=2);
        node.resize(2 * N, init_value);
        lazy.resize(2 * N, default_lazy);
    }
    delay_segtree(vector<int> v) {
        int sz = v.size();
        for(N=1;N<sz;N*=2);
        node.resize(2 * N, init_value);
        lazy.resize(2 * N, default_lazy);
        for (int i = 0; i < sz; i++)
            node[i + N - 1] = v[i];
        for (int i = N - 2; i >= 0; i--)
            node[i] = merge(node[2 * i + 1], node[2 * i + 2]);
    }
    void update(int a, int b, T x, int k = 0, int l = 0, int r = -1) {
        if (r < 0)
            r = N;
        // k 番目のノードに対して遅延評価を行う
        eval(k, l, r);
        // 範囲外なら何もしない
        if (b <= l || r <= a)
            return;
        // 完全に被覆しているならば、遅延配列に値を入れた後に評価
        if (a <= l && r <= b) {
            lazy_transmit(lazy[k], x);
            eval(k, l, r);
        }
        // そうでないならば、子ノードの値を再帰的に計算して、
        // 計算済みの値をもらってくる
        else {
            update(a, b, x, 2 * k + 1, l, (l + r) / 2);
            update(a, b, x, 2 * k + 2, (l + r) / 2, r);
            node[k] = merge(node[2 * k + 1], node[2 * k + 2]);
        }
    }
    // update k th element
    void update(int k, T val) {
        k += N - 1; // leaf
        node[k] = val;
        while (k > 0) {
            k = (k - 1) / 2;
            node[k] = merge(node[k * 2 + 1], node[k * 2 + 2]);
        }
    }
    // [a, b)
    T query(int a, int b, int k = 0, int l = 0, int r = -1) {
        if (r < 0)
            r = N;
        eval(k, l, r);
        if (r <= a or b <= l)
            return default_value;
        if (a <= l and r <= b)
            return node[k];
        int m = (l + r) / 2;
        T vl = query(a, b, k * 2 + 1, l, m);
        T vr = query(a, b, k * 2 + 2, m, r);
        return merge(vl, vr);
    }

    T operator[](const int &k) {
        //遅延評価をまずしておく
        query(k, k + 1);
        return node[k + N - 1];
    }
};

int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);
  ll N,Q;cin>>N>>Q;
  vll x;
  vector<pair<ll,Pll> > query(N);
  for(ll i=0;i<N;i++){
    cin>>query[i].second.first>>query[i].second.second>>query[i].first;
    query[i].second.first-=query[i].first;
    query[i].second.second-=query[i].first;
    x.push_back(query[i].second.first);
    x.push_back(query[i].second.second);
  }
  vll D(Q);
  for(ll i=0;i<Q;i++){
    cin>>D[i];
    x.push_back(D[i]);
  }
  sort(x.begin(),x.end());
  x.erase(unique(x.begin(),x.end()),x.end());
  //debugArray(x,x.size());
  map<ll,ll> mp;
  for(ll i=0;i<x.size();i++){
    mp[x[i]]=i;
  }
  delay_segtree<ll> seg(x.size());
  for(ll i=0;i<N;i++){
    ll l=mp[query[i].second.first],r=mp[query[i].second.second];
    //debug(l);
    //debug(r);
    seg.update(l,r,query[i].first);
  }
  for(ll i=0;i<Q;i++){
    ll ans = seg[mp[D[i]]];
    if(ans==INF)ans = -1;
    cout<<ans<<endl;
  }

  return 0;
}


Measured memory_bytes: 84328