#include <bits/stdc++.h>
using namespace std;
const int N = 600100;
struct node {
  long long l, r;
  int op;
  bool operator<(const node& t) const {
    if (op != t.op) return op < t.op;
    if (l != t.l) return l < t.l;
    return r < t.r;
  }
} a[N];
int h, q, n, cnt;
vector<long long> vt, ans;
long long sum[N << 2], tag[N << 2], lz[N << 2];
int Getid(long long x) {
  return lower_bound(vt.begin(), vt.end(), x) - vt.begin();
}
void Pushdown(int rt, int k) {
  if (tag[rt]) {
    tag[rt << 1] = tag[rt << 1 | 1] = 1;
  }
  if (lz[rt]) {
    lz[rt << 1] += lz[rt];
    lz[rt << 1 | 1] += lz[rt];
    sum[rt << 1] += lz[rt] * (k - (k >> 1));
    sum[rt << 1 | 1] += lz[rt] * (k >> 1);
    lz[rt] = 0;
  }
}
void Add(int L, int R, int l, int r, int rt) {
  if (L <= l && r <= R) {
    sum[rt] += (r - l + 1);
    lz[rt]++;
    return;
  }
  Pushdown(rt, r - l + 1);
  int mid = l + r >> 1;
  if (L <= mid) Add(L, R, l, mid, rt << 1);
  if (mid < R) Add(L, R, mid + 1, r, rt << 1 | 1);
}
void Update(int L, int R, int l, int r, int rt) {
  if (L <= l && r <= R) {
    tag[rt] = 1;
    return;
  }
  Pushdown(rt, r - l + 1);
  int mid = l + r >> 1;
  if (L <= mid) Update(L, R, l, mid, rt << 1);
  if (mid < R) Update(L, R, mid + 1, r, rt << 1 | 1);
}
void Query(int l, int r, int rt) {
  if (l == r) {
    if (!tag[rt] && sum[rt] == cnt) ans.push_back(vt[l]);
    return;
  }
  Pushdown(rt, r - l + 1);
  int mid = l + r >> 1;
  Query(l, mid, rt << 1);
  Query(mid + 1, r, rt << 1 | 1);
}
long long Find(int pos, int l, int r, int rt) {
  if (l == r) return sum[rt];
  Pushdown(rt, r - l + 1);
  int mid = l + r >> 1;
  if (pos <= mid)
    return Find(pos, l, mid, rt << 1);
  else
    return Find(pos, mid + 1, r, rt << 1 | 1);
}
int main() {
  scanf("%d%d", &h, &q);
  for (int i = 0; i < q; i++) {
    int t;
    scanf("%d%I64d%I64d%d", &t, &a[i].l, &a[i].r, &a[i].op);
    for (int j = t; j < h; j++) {
      a[i].l *= 2;
      a[i].r = a[i].r * 2 + 1;
    }
    vt.push_back(a[i].l);
    vt.push_back(a[i].r);
    if (a[i].l - 1 >= (1LL << (h - 1))) vt.push_back(a[i].l - 1);
    if (a[i].r - 1 >= (1LL << (h - 1))) vt.push_back(a[i].r - 1);
    if (a[i].l + 1 <= (1LL << h) - 1) vt.push_back(a[i].l + 1);
    if (a[i].r + 1 <= (1LL << h) - 1) vt.push_back(a[i].r + 1);
    if (a[i].op) cnt++;
  }
  vt.push_back(0);
  vt.push_back(1LL << (h - 1));
  vt.push_back((1LL << h) - 1);
  sort(vt.begin(), vt.end());
  vt.erase(unique(vt.begin(), vt.end()), vt.end());
  n = vt.size() - 1;
  for (int i = 0; i < q; i++) {
    int l = Getid(a[i].l), r = Getid(a[i].r);
    if (a[i].op)
      Add(l, r, 1, n, 1);
    else
      Update(l, r, 1, n, 1);
  }
  Query(1, n, 1);
  if (ans.size() > 1) return 0 * puts("Data not sufficient!");
  if (ans.size() == 1) return 0 * printf("%I64d\n", ans[0]);
  sort(a, a + q);
  long long lmin = a[0].l, rmax = (1LL << (h - 1)) - 1, tot = 0, tmp = 0,
            pos = -1;
  for (int i = 0; i < q; i++) {
    if (a[i].op == 0) {
      if (a[i].l > rmax + 1)
        rmax = max(rmax, a[i].r), lmin = a[i].l,
        tmp = max(tmp, rmax - lmin + 1), tot += tmp, tmp = 0, pos = a[i].l - 1;
      else
        rmax = max(rmax, a[i].r), tmp = max(tmp, rmax - lmin + 1);
    }
  }
  tot += tmp;
  if (tot == (1LL << h) - (1LL << (h - 1)) - 1) {
    if (pos == -1) pos = (1LL << h) - 1;
    if (Find(Getid(pos), 1, n, 1) == cnt) return 0 * printf("%I64d\n", pos);
  }
  puts("Game cheated!");
}
