#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
#define rep(i, n) for (int i = 0; i < n; i++)
#define repr(i, n) for (int i = n-1; i >= 0; i--)
#define ALL(x) x.begin(), x.end()
using ll = long long;
using pii = pair<int, int>;
const int mod = 1e9+7;
const int INF = 1e9;
const int MAX = 1e6;
// const int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
// struct edge {int to, cost;};
// vector<edge> graph[MAX];
// bool visited[MAX];
// int dist[MAX];

int main() {
    // input
    int n, m;
    cin >> n >> m;
    set<int> d1, d2, d3;
    bool flag = true;
    rep(i, m) {
        int s, c;
        cin >> s >> c;
        if (n > 1 and s == 1 and c == 0) {
            flag = false;
            break;
        }
        if (s == 1) {
            if (d1.empty()) {
                d1.insert(c);
            } else if (not d1.count(c)) {
                flag = false;
                break;
            }
        } else if (s == 2) {
            if (d2.empty()) {
                d2.insert(c);
            } else if (not d2.count(c)) {
                flag = false;
                break;
            }
        } else if (s == 3) {
            if (d3.empty()) {
                d3.insert(c);
            } else if (not d3.count(c)) {
                flag = false;
                break;
            }
        }
    }
    // solve
    // output
    if (flag) {
        rep(i, n) {
            if (i == 0) {
                if (d1.empty()) cout << 0;
                else cout << *d1.begin();
            }
            else if (i == 1) {
                if (d2.empty()) cout << 0;
                else cout << *d2.begin();
            }
            else if (i == 2) {
                if (d3.empty()) cout << 0;
                else cout << *d3.begin();
            }
        }
        printf("\n");
    }
    else cout << -1 << endl;
}