#[macro_use]
mod utils {
    macro_rules! input {
        ($($r:tt)*) => {
            let s = {
                use std::io::Read;
                let mut s = String::new();
                std::io::stdin().read_to_string(&mut s).unwrap();
                s
            };
            let mut iter = s.split_whitespace();
            input_inner!{iter, $($r)*}
        };
    }
    macro_rules! input_inner {
        ($iter:expr) => {};
        ($iter:expr, ) => {};

        ($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
            let $var = read_value!($iter, $t);
            input_inner!{$iter $($r)*}
        };
        ($iter:expr, mut $var:ident : $t:tt $($r:tt)*) => {
            let mut $var = read_value!($iter, $t);
            input_inner!{$iter $($r)*}
        };
    }
    macro_rules! read_value {
        ($iter:expr, ( $($t:tt),* )) => {
            ( $(read_value!($iter, $t)),* )
        };
        ($iter:expr, [ $t:tt ; $len:expr ]) => {
            (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
        };
        ($iter:expr, chars) => {
            read_value!($iter, String).chars().collect::<Vec<char>>()
        };
        ($iter:expr, usize1) => {
            read_value!($iter, usize) - 1
        };
        ($iter:expr, $t:ty) => {
            $iter.next().unwrap().parse::<$t>().expect("Parse error")
        };
    }
}

fn main() {
    input! {
        n:usize, m:usize,
        sc:[(usize1, i32); m],
    }
    let mut num = vec![-1; n];
    for (s, c) in sc {
        if num[s] < 0 {
            num[s] = c
        } else if num[s] != c {
            println!("-1");
            return;
        }
    }
    if n != 1 && num[0] == 0 {
        println!("-1");
        return;
    }
    for i in 0..n {
        if num[i] == -1 {
            print!("{}", if i == 0 { 1 } else { 0 });
        } else {
            print!("{}", num[i]);
        }
    }
}
