
// Problem : C - Guess The Number
// Contest : AtCoder Beginner Contest 157
// URL : https://atcoder.jp/contests/abc157/tasks/abc157_c
// Memory Limit : 1024 MB
// Time Limit : 2000 ms
// Powered by CP Editor (https://github.com/coder3101/cp-editor)

 
/*
    全球變暖是過去一個世紀以來地球平均表面溫度異常迅速的升高，這主要歸因於人們燃燒化
    石燃料所釋放的溫室氣體。今天的變暖與過去的氣候變化相比如何？
    過去，在沒有人類幫助的情況下，地球經歷了氣候變化。但是當前的氣候變暖
    過去的變暖事件發生得快得多。為什麼科學家們認為當前的變暖是不自然的？
    在工業革命之前的地球歷史上，地球的氣候因與人類活動無關的自然原因而發生了變化。
    這些自然原因至今仍在起作用，但是它們的影響力太小或發生得太慢
    ，無法解釋近幾十年來的迅速變暖。地球會變暖多少？
    模型預測，隨著世界消耗的化石燃料越來越多，溫室氣體濃度將繼續上升，
    地球的平均地表溫度將隨之上升。根據合理的排放情景，到21世紀末，平均地表溫度可能會上升2°C至6°C。即使減少未來的溫室氣體排放，這種變暖也會發生一些，因為地球系統尚未完全適應我們已經做出的環境變化。
    地球將如何應對變暖溫度？
    全球變暖的影響遠不止溫度升高。變暖改變了降雨模式，加劇了海岸侵蝕，
    延長了某些地區的生長期，融化了冰蓋和冰川，並改變了某些傳染病的範圍
    。其中一些更改已在發生。
    全球變暖是過去一個世紀以來地球平均表面溫度異常迅速的升高，這主要歸因於人們燃燒化
    石燃料所釋放的溫室氣體。今天的變暖與過去的氣候變化相比如何？
    過去，在沒有人類幫助的情況下，地球經歷了氣候變化。但是當前的氣候變暖
    過去的變暖事件發生得快得多。為什麼科學家們認為當前的變暖是不自然的？
    在工業革命之前的地球歷史上，地球的氣候因與人類活動無關的自然原因而發生了變化。
    這些自然原因至今仍在起作用，但是它們的影響力太小或發生得太慢
    ，無法解釋近幾十年來的迅速變暖。地球會變暖多少？
    模型預測，隨著世界消耗的化石燃料越來越多，溫室氣體濃度將繼續上升，
    地球的平均地表溫度將隨之上升。根據合理的排放情景，到21世紀末，平均地表溫度可能會上升2°C至6°C。即使減少未來的溫室氣體排放，這種變暖也會發生一些，因為地球系統尚未完全適應我們已經做出的環境變化。
    地球將如何應對變暖溫度？
    全球變暖的影響遠不止溫度升高。變暖改變了降雨模式，加劇了海岸侵蝕，
    延長了某些地區的生長期，融化了冰蓋和冰川，並改變了某些傳染病的範圍
    。其中一些更改已在發生。
    全球變暖是過去一個世紀以來地球平均表面溫度異常迅速的升高，這主要歸因於人們燃燒化
    石燃料所釋放的溫室氣體。今天的變暖與過去的氣候變化相比如何？
    過去，在沒有人類幫助的情況下，地球經歷了氣候變化。但是當前的氣候變暖
    過去的變暖事件發生得快得多。為什麼科學家們認為當前的變暖是不自然的？
    在工業革命之前的地球歷史上，地球的氣候因與人類活動無關的自然原因而發生了變化。
    這些自然原因至今仍在起作用，但是它們的影響力太小或發生得太慢
    ，無法解釋近幾十年來的迅速變暖。地球會變暖多少？
    模型預測，隨著世界消耗的化石燃料越來越多，溫室氣體濃度將繼續上升，
    地球的平均地表溫度將隨之上升。根據合理的排放情景，到21世紀末，平均地表溫度可能會上升2°C至6°C。即使減少未來的溫室氣體排放，這種變暖也會發生一些，因為地球系統尚未完全適應我們已經做出的環境變化。
    地球將如何應對變暖溫度？
    全球變暖的影響遠不止溫度升高。變暖改變了降雨模式，加劇了海岸侵蝕，
    延長了某些地區的生長期，融化了冰蓋和冰川，並改變了某些傳染病的範圍
    。其中一些更改已在發生。
    全球變暖是過去一個世紀以來地球平均表面溫度異常迅速的升高，這主要歸因於人們燃燒化
    石燃料所釋放的溫室氣體。今天的變暖與過去的氣候變化相比如何？
    過去，在沒有人類幫助的情況下，地球經歷了氣候變化。但是當前的氣候變暖
    過去的變暖事件發生得快得多。為什麼科學家們認為當前的變暖是不自然的？
    在工業革命之前的地球歷史上，地球的氣候因與人類活動無關的自然原因而發生了變化。
    這些自然原因至今仍在起作用，但是它們的影響力太小或發生得太慢
    ，無法解釋近幾十年來的迅速變暖。地球會變暖多少？
    模型預測，隨著世界消耗的化石燃料越來越多，溫室氣體濃度將繼續上升，
    地球的平均地表溫度將隨之上升。根據合理的排放情景，到21世紀末，平均地表溫度可能會上升2°C至6°C。即使減少未來的溫室氣體排放，這種變暖也會發生一些，因為地球系統尚未完全適應我們已經做出的環境變化。
    地球將如何應對變暖溫度？
    全球變暖的影響遠不止溫度升高。變暖改變了降雨模式，加劇了海岸侵蝕，
    延長了某些地區的生長期，融化了冰蓋和冰川，並改變了某些傳染病的範圍
    。其中一些更改已在發生。
    全球變暖是過去一個世紀以來地球平均表面溫度異常迅速的升高，這主要歸因於人們燃燒化
    石燃料所釋放的溫室氣體。今天的變暖與過去的氣候變化相比如何？
    過去，在沒有人類幫助的情況下，地球經歷了氣候變化。但是當前的氣候變暖
    過去的變暖事件發生得快得多。為什麼科學家們認為當前的變暖是不自然的？
    在工業革命之前的地球歷史上，地球的氣候因與人類活動無關的自然原因而發生了變化。
    這些自然原因至今仍在起作用，但是它們的影響力太小或發生得太慢
    ，無法解釋近幾十年來的迅速變暖。地球會變暖多少？
    模型預測，隨著世界消耗的化石燃料越來越多，溫室氣體濃度將繼續上升，
    地球的平均地表溫度將隨之上升。根據合理的排放情景，到21世紀末，平均地表溫度可能會上升2°C至6°C。即使減少未來的溫室氣體排放，這種變暖也會發生一些，因為地球系統尚未完全適應我們已經做出的環境變化。
    地球將如何應對變暖溫度？
    全球變暖的影響遠不止溫度升高。變暖改變了降雨模式，加劇了海岸侵蝕，
    延長了某些地區的生長期，融化了冰蓋和冰川，並改變了某些傳染病的範圍
    。其中一些更改已在發生。
*/

#include <bits/stdc++.h>
using namespace std;
//#include <ext/pb_ds/assoc_container.hpp> 
//#include <ext/pb_ds/tree_policy.hpp> 
//using namespace __gnu_pbds; 
// #include <boost/multiprecision/cpp_int.hpp>
// using namespace boost::multiprecision;

//methods: find_by_order(k); & order_of_key(k);
//To make it an ordered_multiset, use pairs of (value, time_of_insertion)
//to distinguish values which are similar

#define int long long
#define pb push_back
#define ppb pop_back
#define vi vector<int>
#define ed end()
#define bg begin()
#define sz size()
#define ln length()
#define all(x) x.begin(),x.end()
#define allp(x,n) x,x+n
#define endl "\n"
#define NL cout<<'\n';
#define F first
#define S second
#define disp(x) for(auto t : x )cout<<t<<" ";
#define for0(n) for(int i=0;i<n;i++)
#define for0j(n) for(int j=0;j<n;j++)
#define SS <<" "<<
#define arrin(a,n) vi a(n);for0(n){cin>>a[i];}
#define pf(x) cout<<x<<endl;
#define Check pf("Check")
#define gridin(num,n,m) for0(n){for0j(m) cin>>num[i][j];}
#define dispgrid(num,n,m) for0(n){for0j(m) cout<<num[i][j]<<" "; cout<<endl;}
#define tk(a) int a;cin>>a;
#define tk2(a,b)tk(a)tk(b)
#define tk3(a,b,c)tk2(a,b)tk(c)
#define tk4(a,b,c,d)tk2(a,b)tk2(c,d)
#define tk5(a,b,c,d,e)tk4(a,b,c,d)tk(e)
#define tk6(a,b,c,d,e,f)tk3(a,b,c)tk3(d,e,f)
#define tk7(a,b,c,d,e,f,g)tk6(a,b,c,d,e,f)tk(g)
#define tk8(a,b,c,d,e,f,g,h)tk7(a,b,c,d,e,f,g)tk(h)
#define YES cout<<"YES"<<endl;
#define Yes cout<<"Yes"<<endl;
#define NO cout<<"NO"<<endl;
#define No cout<<"No"<<endl;
#define yes cout<<"yes"<<endl;
#define no cout<<"no"<<endl;
#define pii pair<int,int> 
#define vpii vector<pii>
#define acum accumulate
#define fmap gp_hash_table
#define LONG LLONG
const int MOD=1000000007;
const int N=100000;

const int __P=8;

//typedef tree<int, null_type, less<int>, rb_tree_tag, 
//             tree_order_statistics_node_update> 
//    pb_set; 

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
            return os << "(" << p.first << ", " << p.second << ")";
}
template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
            os << "{";
                for(auto it = v.begin(); it != v.end(); ++it) {
                                if( it != v.begin() ) os << ", ";
                                        os << *it;
                                            }
                    return os << "}";
}
template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
            os << "[";
                for(auto it = v.begin(); it != v.end(); ++it) {
                                if( it != v.begin() ) os << ", ";
                                        os << *it;
                                            }
                    return os << "]";
}
template < typename T >
ostream &operator << ( ostream & os, const multiset< T > &v ) {
            os << "[";
                for(auto it = v.begin(); it != v.end(); ++it) {
                                if( it != v.begin() ) os << ", ";
                                        os << *it;
                                            }
                    return os << "]";
}
template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
            os << "[";
                for(auto it = v.begin(); it != v.end(); ++it) {
                                if( it != v.begin() ) os << ", ";
                                        os << it -> first << " = " << it -> second ;
                                            }
                    return os << "]";
}

// ====================FUNCTIONS===================//


void fragamenter();
inline int gcd(int a, int b){ return __gcd(a,b);}
inline int lcm(int a, int b){return (a*b)/gcd(a, b);}
inline bool isPerfectSquare(int x){ int s = sqrt(x); return (s*s == x);}
inline bool isFibonacci(int n){return isPerfectSquare(5*n*n + 4) || isPerfectSquare(5*n*n - 4);} 
inline bool isVowel(char a){if(a=='a' || a=='e' || a=='i' || a=='o' || a=='u')return true;return false;}

int gcdExtended(int a, int b, int *x, int *y); 
int modInverse(int a, int m){ 
    int x, y, g = gcdExtended(a, m, &x, &y); 
    if (g != 1) 
        return -1; 
    else{ 
        int res = (x%m + m) % m; 
        return res; 
    } 
} 

int gcdExtended(int a, int b, int *x, int *y) { 
    if (a == 0){ *x = 0, *y = 1;  return b;} 
    int x1, y1;
    int gcd = gcdExtended(b%a, a, &x1, &y1); 
    *x = y1 - (b/a) * x1; 
    *y = x1; 
    return gcd; 
} 

int modpow(int x, int y, int p){
    int res = 1;     
    x = x % p; 
    while (y > 0){
        if (y & 1) 
            res = (res*x) % p; 
        y = y>>1; 
        x = (x*x) % p;   
    } 
    return res; 
} 

unordered_map<int,bool> memo_p;
bool isPrime(int n){
    if(memo_p.find(n)!=memo_p.end()){
        return memo_p[n];
    }
    bool res;
    if (n < 1){res= false;memo_p[n]=res; return res;};if (n <= 3){  res= true;memo_p[n]=res; return res;} 
    if (n%2 == 0 || n%3 == 0){res=false;memo_p[n]=res; return res;}
    for (int i=5; i*i<=n; i=i+6) if (n%i == 0 || n%(i+2) == 0){res= false;memo_p[n]=res; return res;};  
    res= true;
    memo_p[n]=res; 
    return res;
}

vi primeFactors(int n){  
    if(n==1) return vi(1,1);
    bool idx[1]={false};
    vi res;
    while (n%2 == 0){  
        if(!idx[1]){idx[1]=true;res.pb(2);}
        n = n/2;  
    }  
    for (int i=3;i*i<=n; i+=2){
        bool once=false;
        while (n%i==0){ if(!once){res.pb(i);once=true;} n=n/i; }  
    }  
    if (n > 2)res.pb(n);
    return res;
}
void fragamenter(){
    int a=3,b=123,c=124,d=a+b+c;
    for0(10){c=a+b;b=a+d;}
    for0(10){c=a+b;b=a+d;}
    for0(10){c=a+b;b=a+d;}
    for0(10){c=a+b;b=a+d;}
    for0(10){c=a+b;b=a+d;}
    for0(10){c=a+b;b=a+d;}   
}

  
void precomp(int t){
    if(t==0) return;
    fragamenter();
    precomp(t-1);
}

vi divisors(int n){ 
    vi res;
    for (int i=1; i<=sqrt(n); i++){ 
        if (n%i == 0){ if (n/i == i){ res.pb(i); } else{ res.pb(n/i); res.pb(i); } } 
    } 
    return res;
}   
int sumofdigit(int n){
    int res=0;
    while(n){
        res+=n%10;
        n/=10;
    }
    return res;
}

int countGreater(vi arr, int k){ 
	int n=arr.sz;
    int l = 0; 
    int r = n - 1; 

    int leftGreater = n; 
 
    while (l <= r) { 
        int m = l + (r - l) / 2; 
 
        if (arr[m] > k) { 
            leftGreater = m; 
            r = m - 1; 
        } 
        else
            l = m + 1; 
    } 
    return (n - leftGreater); 
}

int digits(int n){
	if(n==0)return 1;
	int cnt=0;
	while(n>0){
		cnt++;
		n/=10;
	}
	return cnt;
}

int revn(int n){
	int res=0;
	while(n>0){
		res=res*10+n%10;
		n/=10;
	}
	return res;
}

int ithdigit(int i,int n){
	while(i--){
		n/=10;
	}
	return n%10;
}
int32_t main(){
    ios_base::sync_with_stdio(false);cin.tie(0);
	precomp(__P>>1);
	tk2(n,m)
	if(m==0){
		if(n!=0)
			pf(-1)
		else
			pf(0)
		return 0;
	}
	string res="";
	for0(n){
		res.pb('x');
	}
	bool hoga=true;
	for0(m){
		tk(s)
		string c;
		cin>>c;
		if(res[s-1]=='x'){
			res[s-1]=c[0];
		}else if(c[0]!=res[s-1]){
			hoga=false;
		}
	}
	//pf(res)
	for0(res.sz){
		if(res[i]!='x'){
			break;
		}else{
			res[i]='1';
		}
	}
	for0(res.sz){
		if(res[i]=='x'){
			res[i]='0';
		}
	}
	if(res=="000"){
		hoga=false;		
	}else if(res=="00"){
		hoga=false;
	}
	if(hoga){
		pf(res)
	}else{
		pf(-1)
	}
	return 0;
}

 