#include <bits/stdc++.h>
using namespace std;
template <class T>
T abs(T x) {
  return x > 0 ? x : -x;
}
int n;
int m;
vector<pair<long long, long long> > w;
vector<pair<long long, int> > v;
pair<long long, long long> get(int i, long long x) {
  pair<long long, long long> y(x, x);
  while (i < n) {
    y.first = y.first * 2;
    y.second = y.second * 2 + 1;
    i++;
  }
  return y;
}
int main() {
  scanf("%d%d", &n, &m);
  pair<long long, long long> cur = get(1, 1);
  for (int i = 0; i < m; i++) {
    int h, t;
    long long l, r;
    cin >> h >> l >> r >> t;
    if (t == 1) {
      cur.first = max(cur.first, get(h, l).first);
      cur.second = min(cur.second, get(h, r).second);
    } else {
      w.push_back(make_pair(get(h, l).first, get(h, r).second));
    }
  }
  if (cur.first > cur.second) {
    printf("Game cheated!\n");
    return 0;
  }
  for (int i = 0; i < ((int)(w).size()); i++) {
    if (w[i].first > cur.second || w[i].second < cur.first) continue;
    v.push_back(make_pair(max(w[i].first, cur.first), 1));
    v.push_back(make_pair(min(w[i].second, cur.second), -1));
  }
  sort((v).begin(), (v).end());
  int bal = 0;
  long long cnt = 0;
  long long last = -1;
  if (v.empty()) {
    cnt = cur.second - cur.first + 1;
    last = cur.second;
  } else {
    if (v[0].first > cur.first) {
      cnt += v[0].first - cur.first;
      last = v[0].first - 1;
    }
    for (int i = 0; i + 1 < ((int)(v).size()); i++) {
      bal += v[i].second;
      if (bal == 0 && v[i + 1].first > v[i].first + 1) {
        cnt += v[i + 1].first - v[i].first - 1;
        last = v[i + 1].first - 1;
      }
    }
    if (v[((int)(v).size()) - 1].first < cur.second) {
      cnt += cur.second - v[((int)(v).size()) - 1].first;
      last = cur.second;
    }
  }
  if (cnt == 0) {
    printf("Game cheated!\n");
    return 0;
  }
  if (cnt > 1) {
    printf("Data not sufficient!\n");
    return 0;
  }
  cout << last << endl;
  return 0;
}
