// ※※※ 解答不能 ※※※
// WA版.
// 解き直し.
// ABC 128解説.
// https://img.atcoder.jp/abc128/editorial.pdf
// #include <bits/stdc++.h>
// using namespace std;
// using LL = long long;
// const LL MAX = 1e9 + 1;
// LL q[210012], dist[210012];
// 
// int main(){
//     
//     // 以下, 解説通り.
//     // 1. 入力情報取得.
//     int N, Q;
//     scanf("%d %d", &N, &Q);
//     vector<vector<LL>> v;
//     for(int i = 0; i < N; i++){
//         LL s, t, x;
//         scanf("%lld %lld %lld", &s, &t, &x);
//         vector<LL> a, d;
//         
//         // 追加イベント (s - x, 1, x)
//         a.push_back(s - x);
//         a.push_back(1LL);
//         a.push_back(x);
//         
//         // 削除イベント (t - x, -1, x)
//         d.push_back(t - x);
//         d.push_back(-1LL);
//         d.push_back(x);
//         
//         // イベントを配列 に 追加.
//         v.push_back(a);
//         v.push_back(d);
//     }
//     for(int i = 0; i < Q; i++) scanf("%lld", q + i), dist[i] = MAX;
//     // for(int i = 0; i < Q; i++) printf("%lld ", q[i]);
//     
//     // 2. イベント を 昇順sort.
//     sort(v.begin(), v.end());
//     // for(auto &x : v){
//     //     for(auto &y : x) printf("%lld ", y);
//     //     printf("\n");
//     // }
//     
//     // 3. Q人 それぞれ が 進む距離 を 計算.
//     // -> 0 ≤ D1 < D2 < ... < DQ の 条件 に 注意.
//     int index = 0;
//     map<LL, int> m;
//     for(auto &p : v){
//         // map に key 追加 or 削除.
//         if(p[1] == 1)                  m[p[2]]++;
//         if(p[1] == -1 && m[p[2]] > 1)  m[p[2]]--;
//         if(p[1] == -1 && m[p[2]] == 1) m.erase(p[2]);
//         
//         // map の 最初の要素を取得.
//         auto iter = m.begin();
//         LL val = iter->first;
//         // cout << "---------------------" << endl;
//         // for(auto &x : m) cout << x.first << " " << x.second << endl;
//         // cout << "val=" << val << endl;
//         // cout << "---------------------" << endl;
//         
//         // i番目確認.
//         if(p[0] <= q[index]) dist[index] = min(dist[index], val);
//         
//         // (i + 1)番目確認.
//         if(p[0] > q[index]){
//             index++;
//             if(p[0] <= q[index] && index < Q) dist[index] = min(dist[index], val);
//         }
//         
//         // (Q + 1)番目は存在しないので, 終了.
//         if(index >= Q) break;
//     }
//     
//     // 3. 出力 ～ 後処理.
//     for(int i = 0; i < Q; i++){
//         LL d = dist[i];
//         if(d > 0) printf("%lld\n", d);
//         else      printf("%d\n", -1);
//     }
//     return 0;
//     
// }

// 正答者の解答を復習.
// diuven_fanclub氏.
// https://atcoder.jp/contests/abc128/submissions/5639936
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;

int N, Q;
struct roadwork{
    int s, t, x;
    bool operator < (const roadwork& rhs) const{
        return s < rhs.s;
    }
};

int main(){
    
    // 1. 入力情報取得.
    scanf("%d %d", &N, &Q);
    vector<roadwork> v;
    for (int i = 0; i < N; i++) {
        int s, t, x;
        scanf("%d %d %d", &s, &t, &x);
        v.push_back({s - x, x, 1});
        v.push_back({t - x, x, 0});
    }
    
    // 2. 降順ソート.
    sort(v.rbegin(), v.rend());
    
    // 3. Q人 それぞれ が 進む距離 を 計算.
    multiset<int> sp;
    for(int i = 0; i < Q; i++){
        int d;
        scanf("%d", &d);
        while(!v.empty() && v.back().s <= d){
            if(v.back().x) sp.insert(v.back().t);
            else           sp.erase(sp.find(v.back().t));
            v.pop_back();
        }
        if(sp.empty()) printf("%d\n", -1);
        else           printf("%d\n", *sp.begin());
    }
    
    // 4. 後処理.
    return 0;
    
}

Measured memory_bytes: 15852