#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
struct Query {
  int r;
  long long x, y;
} q[MAXN];
int a[1000005];
long long A[1000005];
long long pos[1000005];
int n, m;
int tot = 0;
map<long long, int> mp;
void input() {
  int r, level;
  long long x, y;
  for (int i = 1; i <= m; i++) {
    scanf("%d %I64d %I64d %d", &level, &x, &y, &r);
    for (int j = level + 1; j <= n; j++) {
      x = x * (long long)2;
      y = y * (long long)2 + (long long)1;
    }
    q[i].x = x;
    q[i].y = y;
    q[i].r = r;
    A[i * 2 - 1] = x;
    A[i * 2] = y;
  }
}
void solve() {
  memset(a, 0, sizeof(a));
  A[0] = (long long)1 << (n - 1);
  sort(A + 1, A + 1 + 2 * m);
  mp.clear();
  tot = 1;
  mp[A[0]] = 1;
  pos[tot] = A[1];
  A[2 * m + 1] = ((long long)1 << n) - (long long)1;
  for (int i = 1; i <= 2 * m + 1; i++) {
    if (A[i] - A[i - 1] > 2) {
      tot = tot + 3;
      mp[A[i]] = tot;
      pos[tot] = A[i];
    } else if (A[i] - A[i - 1] == 2) {
      tot = tot + 2;
      mp[A[i]] = tot;
      pos[tot - 1] = A[i] - 1;
      pos[tot] = A[i];
    } else if (A[i] - A[i - 1] == 1) {
      tot = tot + 1;
      mp[A[i]] = tot;
      pos[tot] = A[i];
    }
  }
  for (int i = 1; i <= m; i++) {
    int x = mp[q[i].x];
    int y = mp[q[i].y];
    if (q[i].r == 1) {
      a[1]++;
      a[x]--;
      a[y + 1]++;
      a[tot + 1]--;
    } else {
      a[x]++;
      a[y + 1]--;
    }
  }
  int cnt = 0;
  int position;
  for (int i = 1; i <= tot; i++) {
    a[i] += a[i - 1];
    if (a[i] == 0) {
      cnt++;
      position = i;
    }
  }
  if (cnt == 0) {
    puts("Game cheated!");
  } else if (cnt >= 2) {
    puts("Data not sufficient!");
  } else {
    if (n == 1) {
      puts("1");
      return;
    }
    printf("%I64d\n", pos[position]);
  }
}
int main(void) {
  while (~scanf("%d %d", &n, &m)) {
    input();
    solve();
  }
  return 0;
}
