use std::io::{stdin, Read, StdinLock};
use std::str::FromStr;

fn main() {
    let cin = stdin();
    let mut scan = Scanner::new(cin.lock());
    let n = scan.read::<usize>();
    let q = scan.read::<usize>();
    let mut s = vec![];
    let mut t = vec![];
    let mut x = vec![];
    for _ in 0..n {
        s.push(scan.read::<i64>());
        t.push(scan.read::<i64>());
        x.push(scan.read::<i64>());
    }
    let d = scan.readn::<i64>(q);
    let mut sx = vec![];
    let mut tx = vec![];
    for i in 0..n {
        sx.push(s[i] - x[i]);
        tx.push(t[i] - x[i]);
    }

    let min_p = -1_000_000_000i64;
    let max_p = 1_000_000_000i64;
    let mut p = vec![];
    p.extend(sx.iter());
    p.extend(tx.iter());
    p.extend(d.iter());
    p.push(-min_p);
    p.push(max_p);
    let cp = coord_comp(&p);
    let v = vec![1i64<<60;cp[&max_p]+1];
    let mut segtree = SegTree::new(v, 1i64<<60, std::cmp::min);
    for i in 0..n {
        segtree.set(cp[&sx[i]]..cp[&tx[i]], x[i]);
    }
    for i in 0..q {
        let ret = segtree.get(cp[&d[i]]);
        if ret == 1i64<<60 {
            println!("-1");
        } else {
            println!("{}", ret);
        }
    }
}

#[allow(dead_code)]
fn coord_comp(slice: &[i64]) -> std::collections::HashMap<i64, usize> {
    let mut set = std::collections::BTreeSet::new();
    for &item in slice {
        set.insert(item);
    }
    let mut hmap = std::collections::HashMap::new();
    for (i, &v) in set.iter().enumerate() {
        hmap.insert(v, i);
    }
    hmap
}

use std::ops::Range;

#[allow(dead_code)]
fn contains(p: &Range<usize>, q: &Range<usize>) -> bool {
    p.start <= q.start && q.end <= p.end
}

#[allow(dead_code)]
fn separates(p: &Range<usize>, q: &Range<usize>) -> bool {
    p.end <= q.start || q.end <= p.start
}

#[allow(dead_code)]
fn size(p: &Range<usize>) -> usize {
    p.end - p.start
}

#[allow(dead_code)]
struct SegTree<'a> {
    node: Vec<i64>,
    zero: i64,
    op: Box<Fn(i64, i64) -> i64 + 'a>,
    n: usize,
}

#[allow(dead_code)]
impl <'a> SegTree<'a> {
    fn new<B>(v: Vec<i64>, zero: i64, op: B) -> SegTree<'a> where B: Fn(i64, i64) -> i64 + 'a {
        let size = v.len();
        let mut n = 1usize;
        while n < size {n *= 2}
        let mut node = vec![zero; 2*n-1];
        for i in 0..size {node[i+n-1] = v[i]}
        for i in (0..n - 1).rev() {node[i] = op(node[2*i+1], node[2*i+2])}
        SegTree {node: node, zero: zero, op: Box::new(op), n: n}
    }

    fn get(&self, mut x: usize) -> i64 {
        x += self.n - 1;
        let mut ret = self.node[x];
        while x > 0 {
            x = (x - 1) / 2;
            ret = (self.op)(ret, self.node[x]);
        }
        ret
    }

    fn set(&mut self, query: Range<usize>, value: i64) {
        let n = self.n;
        self.setrec(query, 0, 0..n, value);
    }

    fn setrec(&mut self, query: Range<usize>, k: usize, range: Range<usize>, value: i64) {
        if separates(&query, &range) {return;}
        if contains(&query, &range) {
            self.node[k] = (self.op)(self.node[k], value);
            return;
        }
        self.setrec(query.clone(), 2 * k + 1, range.start..(range.start + range.end) / 2, value);
        self.setrec(query.clone(), 2 * k + 2, (range.start + range.end) / 2..range.end, value);
    }
}

// region template
#[allow(dead_code)]
fn iu(i: i64) -> usize { i as usize }

#[allow(dead_code)]
fn ui(i: usize) -> i64 { i as i64 }

#[allow(dead_code, deprecated)]
fn join<T: std::fmt::Display>(slice: &[T], sep: &str) -> String {
    let strings = slice.iter().map(|t| format!("{}", t)).collect::<Vec<_>>();
    strings.connect(sep)
}

#[allow(dead_code)]
fn arr<'a, S, T>(n: usize, mut f: S) -> Vec<T> where S: FnMut(usize) -> T + 'a {
    (0..n).map(|i| f(i)).collect::<Vec<T>>()
}

struct Scanner<'a> {
    cin: StdinLock<'a>,
}

#[allow(dead_code)]
impl<'a> Scanner<'a> {
    fn new(cin: StdinLock<'a>) -> Scanner<'a> {
        Scanner { cin: cin }
    }

    fn read1<T: FromStr>(&mut self) -> Option<T> {
        let token = self.cin.by_ref().bytes().map(|c| c.unwrap() as char)
            .skip_while(|c| c.is_whitespace())
            .take_while(|c| !c.is_whitespace())
            .collect::<String>();
        token.parse::<T>().ok()
    }

    fn read<T: FromStr>(&mut self) -> T {
        self.read1().unwrap()
    }

    fn readn<T: FromStr>(&mut self, n: usize) -> Vec<T> {
        (0..n).map(|_| self.read::<T>()).collect()
    }

    fn chars(&mut self) -> Vec<char> {
        self.read::<String>().chars().collect()
    }
}
// endregion

Measured memory_bytes: 77612