//auto 関数名 = [(&:ラムダ外の引数をとる時))](引数の型1 引数名1, 引数の型2, 引数名2, ...) { 関数の処理 }; //inside main() define function. take care of };
// for (int tmp = 0; tmp < (1 << ビット数); tmp++) {
//   bitset<ビット数> s(tmp);
//   // (ビット列sに対する処理)
// }
// sort(配列変数.begin(), 配列変数.end());
// do {
//   // 順列に対する処理
// } while (next_permutation(配列変数.begin(), 配列変数.end()));
//const double PI = acos(-1); M_PI
// cout << fixed << setprecision(10);
#include <bits/stdc++.h>
#include <regex>
using namespace std;
#define _GLIBCXX_DEBUG 
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define all(v) v.begin(), v.end() //sort(all(vec)); ,reverse(all(vec));etc
int main(){
    int n,m;
    cin>>n>>m;
    vector<string>vec(n);
    int s;
   string c;
  rep(i,m)){
       cin>>s>>c;
       if(s==1&&c=="0"){
           cout<<-1<<endl;
           return 0;
       }
       if(vec.at(s-1)==""){
         vec.at(s-1)=c;
       }
       else if(vec.at(s-1)!=c){
           cout<<-1<<endl;
           return 0;
       }
      
   }
   string ans="";

   if(n!=1&&vec.at(0)==""){
       vec.at(0)="1";
   }
   rep(i,n){
       if(vec.at(i)==""){
           ans+="0";
       }else{
           ans+=vec.at(i);
       }
   }
   //cout<<vec.at(0)<<vec.at(1)<<vec.at(2)<<endl;
   cout<<ans<<endl;

    
}
