#include <bits/stdc++.h>
using namespace std;
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define REPR(i, n) for (int i = n; i >= 0; --i)
#define FOR(i, n, m) for (int i = m; i < n; i++)
#define MM(i, n, m) for (int i = m; i <= n; i++)
#define INF 1e9
#define ALL(v) v.begin(), v.end()

typedef long long ll;

/**
 * C問以降は ll を使う.
 * double型にするのを忘れない.
 * nC2の求め方 (1/2)*n*(n-1)
 * vector<型> 変数名(要素数, 初期値)
 * pair<型, 型> 変数名
 * map<型, 型> 変数名  // 連想配列
 * priority_queue<型> 変数名  // 最大値から出てくるヒープ
*/
int main()
{
    int N, M;
    cin >> N >> M;
    vector<pair<int, int>> pairs(M);
    REP(i, M)
    {
        int s, c;
        cin >> s >> c;
        pairs.at(i) = make_pair(s, c);
    }
    sort(ALL(pairs));
    // 桁が合わないとき
    if (N != pairs.at(M - 1).first)
    {
        cout << -1 << endl;
        return 0;
    }

    // 同じ桁数を別の数字で指定してるとき
    // 真の配列
    vector<pair<int, int>> new_pair;

    new_pair.push_back(make_pair(pairs.at(0).first, pairs.at(0).second));
    for (int i = 1; i < M; i++)
    {
        if (new_pair.at(size(new_pair) - 1).first == pairs.at(i).first)
        {
            if (new_pair.at(size(new_pair) - 1).second != pairs.at(i).second)
            {
                cout << -1 << endl;
                return 0;
            }
        }
        else
        {
            new_pair.push_back(make_pair(pairs.at(i).first, pairs.at(i).second));
        }
    }
    // REP(i, size(new_pair))
    // {
    //     cout << new_pair.at(i).first << " " << new_pair.at(i).second << endl;
    // }

    // 左からi桁目がc
    int ans = 0;
    REP(i, size(new_pair))
    {
        ans += new_pair.at(i).second * pow(10, N - new_pair.at(i).first);
    }
    cout << ans << endl;
    return 0;
}