#include <bits/stdc++.h>
using namespace std;
using lint = long long;
struct edge {
  lint to;
  lint cost;
};
using P = pair<lint, lint>;
using D = pair<double, double>;
using mll = map<lint, lint>;
const lint mod = 1000000007LL;
const lint inf = 3LL * mod * mod;
const double Pi = acos(-1.0);
template <class T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
lint modpow(lint x, lint n, lint m) {
  lint ans = 1;
  while (n > 0) {
    if (n & 1) {
      ans *= x;
      if (m <= ans) ans %= m;
    }
    x *= x;
    if (m <= x) x %= m;
    n >>= 1;
  }
  return ans;
}
lint fact[3000000];
void f_init(lint n) {
  if (3000000 <= n) return;
  fact[0] = fact[1] = 1;
  for (lint i = 2; i <= n; ++i) {
    fact[i] = i * fact[i - 1];
    if (mod <= fact[i]) fact[i] %= mod;
  }
  return;
}
lint comb(lint n, lint r) {
  if (n < r) return 0;
  if (n == r) return 1;
  lint ans = fact[n] * modpow(fact[n - r], mod - 2, mod) % mod *
             modpow(fact[r], mod - 2, mod) % mod;
  if (ans < 0) return ans + mod;
  return ans;
}
lint nck[1010][1010];
void comb(lint n) {
  for (int(i) = 0; (i) < (n + 1); ++(i)) {
    for (int(j) = 0; (j) < (i + 1); ++(j)) {
      if (j == 0 || i == j)
        nck[i][j] = 1;
      else
        nck[i][j] = nck[i - 1][j - 1] + nck[i - 1][j];
    }
  }
}
lint gcd(lint a, lint b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
lint lcm(lint a, lint b) { return a / gcd(a, b) * b; }
bool pri(lint p) {
  for (lint i = 2; i * i <= p; i == 2 ? ++i : i += 2)
    if (p % i == 0) return false;
  return p > 1;
}
mll factring(lint n) {
  mll ans;
  for (lint i = 2; i * i <= n; ++i) {
    while (n % i == 0) {
      n /= i;
      ++ans[i];
    }
  }
  if (n != 1) ++ans[n];
  return ans;
}
lint xor128() {
  static lint x = 123456789, y = 362436069, z = 521288629, w = 88675123;
  lint t = (x xor (x << 11));
  x = y;
  y = z;
  z = w;
  return (w = (w xor (w >> 19)) xor (t xor (t >> 8)));
}
double dis(D a, D b) {
  double x = a.first - b.first, y = a.second - b.second;
  return sqrt(x * x + y * y);
}
bool kousa(double ax, double ay, double bx, double by, double cx, double cy,
           double dx, double dy) {
  double ta = (cx - dx) * (ay - cy) + (cy - dy) * (cx - ax);
  double tb = (cx - dx) * (by - cy) + (cy - dy) * (cx - bx);
  double tc = (ax - bx) * (cy - ay) + (ay - by) * (ax - cx);
  double td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx);
  return tc * td < 0 && ta * tb < 0;
}
class unionfind {
 private:
  int par[2 * 100010], ranks[2 * 100010], sizeth[2 * 100010];

 public:
  void init(int n) {
    for (int i = 0; i < n; ++i) {
      par[i] = i;
      ranks[i] = 0;
      sizeth[i] = 1;
    }
  }
  int root(int x) {
    if (par[x] == x) return x;
    return par[x] = root(par[x]);
  }
  bool same(int x, int y) { return root(x) == root(y); }
  void unite(int x, int y) {
    x = root(x);
    y = root(y);
    if (x == y) return;
    if (ranks[x] < ranks[y]) {
      par[x] = y;
      sizeth[y] += sizeth[x];
    } else {
      par[y] = x;
      if (ranks[x] == ranks[y]) ++ranks[x];
      sizeth[x] += sizeth[y];
    }
  }
};
int n, m;
int ans[3];
bool a, b, c;
int main() {
  cin >> n >> m;
  for (int(i) = 0; (i) < (m); ++(i)) {
    int s, d;
    cin >> s >> d;
    s--;
    if (s == 0) {
      if (a && (ans[0] != d)) {
        cout << -1 << endl;
        return 0;
      }
      a = 1;
    } else if (s == 1) {
      if (b && (ans[1] != d)) {
        cout << -1 << endl;
        return 0;
      }
      b = 1;
    } else {
      if (c && (ans[2] != d)) {
        cout << -1 << endl;
        return 0;
      }
      c = 1;
    }
    ans[s] = d;
  }
  if (n != 1 && ans[0] == 0) {
    cout << -1 << endl;
    return 0;
  }
  if (n == 3)
    cout << 100 * max(1, ans[0]) + 10 * ans[1] + ans[2] << endl;
  else if (n == 2)
    cout << 10 * max(1, ans[0]) + ans[1] << endl;
  else
    cout << ans[0] << endl;
}
