#include <bits/stdc++.h>
using namespace std;
inline int nextint() {
  int x;
  scanf("%d", &x);
  return x;
}
inline long long nextll() {
  long long x;
  scanf("%lld", &x);
  return x;
}
template <typename T>
void scanint(T& x) {
  T c = getchar();
  while (((c < 48) || (c > 57)) && (c != '-')) c = getchar();
  bool neg = false;
  if (c == '-') {
    neg = true;
    c = getchar();
  }
  x = 0;
  for (; c < 48 || c > 57; c = getchar())
    ;
  for (; c > 47 && c < 58; c = getchar()) x = (x * 10) + (c - 48);
  if (neg) x = -x;
}
template <typename T>
T min_(T a, T b) {
  return a > b ? b : a;
}
template <typename T, typename... Ts>
T min_(T first, Ts... last) {
  return min_(first, min_(last...));
}
template <typename T>
T max_(T a, T b) {
  return a > b ? b : a;
}
template <typename T, typename... Ts>
T max_(T first, Ts... last) {
  return max_(first, max_(last...));
}
template <class T, class S>
std::ostream& operator<<(std::ostream& os, const std::pair<T, S>& t) {
  os << "(" << t.first << ", " << t.second << ")";
  return os;
}
template <typename T>
ostream& operator<<(ostream& out, const vector<T>& v) {
  out << "[";
  size_t last = v.size() - 1;
  for (size_t i = 0; i < v.size(); ++i) {
    out << v[i];
    if (i != last) out << ", ";
  }
  out << "]";
  return out;
}
template <typename T>
ostream& operator<<(ostream& out, const set<T>& v) {
  out << "{";
  auto last = v.end();
  for (auto i = v.begin(); i != last;) {
    out << *i;
    if (++i != last) out << ", ";
  }
  out << "}";
  return out;
}
template <typename T, typename VAL>
ostream& operator<<(ostream& out, const map<T, VAL>& v) {
  out << "{";
  auto last = v.end();
  for (auto i = v.begin(); i != last;) {
    out << *i;
    if (++i != last) out << ", ";
  }
  out << "}";
  return out;
}
template <typename Arg, typename... Args>
void doPrint(std::ostream& out, Arg&& arg, Args&&... args) {
  out << "<< ";
  out << std::forward<Arg>(arg);
  using expander = int[];
  (void)expander{0, (void(out << ", " << std::forward<Args>(args)), 0)...};
  out << " >>\n";
}
long long pwr(long long base, long long p, long long mod) {
  long long ans = 1;
  while (p) {
    if (p & 1) ans = (ans * base) % mod;
    base = (base * base) % mod;
    p /= 2;
  }
  return ans;
}
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long lcm(long long a, long long b) { return a * (b / gcd(a, b)); }
const long double PI = (long double)(3.1415926535897932384626433832795);
const long long mx_ll = numeric_limits<long long>::max();
const int mx_int = numeric_limits<int>::max();
const int mod = 1e9 + 7;
const int oo = 0x3f3f3f3f;
const long long OO = 0x3f3f3f3f3f3f3f3fll;
const double eps = 1e-9;
const int dx[8] = {0, 1, 0, -1, -1, 1, -1, 1};
const int dy[8] = {1, 0, -1, 0, -1, 1, 1, -1};
const int maxn = 100123;
int n;
int cub[5][10];
int form(int h[], int d[], int u[], int x) {
  int num = 0;
  for (int i = 0; i < (int)(6); i++) {
    for (int j = 0; j < (int)(6); j++) {
      for (int k = 0; k < (int)(6); k++) {
        num = u[k];
        if (num == x) return 1;
        num += d[j] * 10;
        if (num == x) return 1;
        num += h[i] * 100;
        if (num == x) return 1;
      }
    }
  }
  return 0;
}
int make(int x) {
  if (x >= pow(10, n)) return 0;
  if (form(cub[0], cub[1], cub[2], x)) return 1;
  if (form(cub[0], cub[2], cub[1], x)) return 1;
  if (form(cub[1], cub[0], cub[2], x)) return 1;
  if (form(cub[1], cub[2], cub[0], x)) return 1;
  if (form(cub[2], cub[0], cub[1], x)) return 1;
  if (form(cub[2], cub[1], cub[0], x)) return 1;
  return 0;
}
int solve() {
  int x = 0;
  while (make(x + 1)) x++;
  return x;
}
int main() {
  for (int i = 0; i < (int)(3); i++)
    for (int j = 0; j < (int)(6); j++) cub[i][j] = -123456;
  cin >> n;
  for (int i = 0; i < (int)(n); i++) {
    for (int j = 0; j < (int)(6); j++) cin >> cub[i][j];
  }
  cout << solve() << endl;
  return 0;
}
