#include <bits/stdc++.h>   using namespace std;   template <typename T>   T in() {     char ch;     T n = 0;     bool ng = false;     while (1) {       ch = getchar();       if (ch ==  - ) {         ng = true;         ch = getchar();         break;       }       if (ch >=  0  && ch <=  9 ) break;     }     while (1) {       n = n * 10 + (ch -  0 );       ch = getchar();       if (ch <  0  || ch >  9 ) break;     }     return (ng ? -n : n);   }   template <typename T>   inline T Dist(T x1, T y1, T x2, T y2) {     return sqrt((x1 - x2 * x1 - x2) + (y1 - y2 * y1 - y2));   }   template <typename T>   inline T POW(T B, T P) {     if (P == 0) return 1;     if (P & 1)       return B * POW(B, P - 1);     else       return (POW(B, P / 2) * POW(B, P / 2));   }   template <typename T>   inline T ABS(T a) {     if (a < 0)       return -a;     else       return a;   }   template <typename T>   inline T Gcd(T a, T b) {     if (a < 0) return Gcd(-a, b);     if (b < 0) return Gcd(a, -b);     return (b == 0) ? a : Gcd(b, a % b);   }   template <typename T>   inline T Lcm(T a, T b) {     if (a < 0) return Lcm(-a, b);     if (b < 0) return Lcm(a, -b);     return a * (b / Gcd(a, b));   }   long long Bigmod(long long base, long long power, long long MOD) {     long long ret = 1;     while (power) {       if (power & 1) ret = (ret * base) % MOD;       base = (base * base) % MOD;       power >>= 1;     }     return ret;   }   long long ModInverse(long long number, long long MOD) {     return Bigmod(number, MOD - 2, MOD);   }   int Set(int N, int pos) { return N = N | (1 << pos); }   int Reset(int N, int pos) { return N = N & ~(1 << pos); }   bool Chkbit(int N, int pos) { return (bool)(N & (1 << pos)); }   bool isVowel(char ch) {     ch = toupper(ch);     if (ch ==  A  || ch ==  U  || ch ==  I  || ch ==  O  || ch ==  E )       return true;     return false;   }   bool isConst(char ch) {     if (isalpha(ch) && !isVowel(ch)) return true;     return false;   }   int toInt(string s) {     int sm;     stringstream ss(s);     ss >> sm;     return sm;   }   long long int toLlint(string s) {     long long int sm;     stringstream ss(s);     ss >> sm;     return sm;   }   struct z {     long long int lft, rgt;     z() {}     z(long long int _, long long int __) { lft = _, rgt = __; }   };   int h, q;   z Solve(long long int lev, long long int l, long long int r) {     long long int now = l, now1 = r;     for (int i = lev + 1; i <= h; i++) {       now *= 2LL;       now1 *= 2LL;       now1 += 1LL;     }     return z(now, now1);   }   vector<z> A, B;   bool cmp(z a, z b) { return ((a.rgt - a.lft) > (b.rgt - b.lft)); }   bool cmp1(z a, z b) { return (a.lft < b.lft); }   vector<z> C;   int main() {     h = in<int>(), q = in<int>();     for (int i = 0; i < q; i++) {       long long int a, l, r, id;       a = in<long long int>(), l = in<long long int>(), r = in<long long int>(),       id = in<long long int>();       if (id)         A.push_back(Solve(a, l, r));       else         B.push_back(Solve(a, l, r));     }     sort(B.begin(), B.end(), cmp1);     long long int lf, rg;     if (A.size() == 0) {       z tp = Solve(1, 1, 1);       lf = tp.lft, rg = tp.rgt;     } else {       z tp = Solve(1, 1, 1);       lf = tp.lft, rg = tp.rgt;       for (int i = 0; i < A.size(); i++) {         long long int l = A[i].lft, r = A[i].rgt;         if (lf > r || rg < l) {           printf( Game cheated! n );           return 0;         }         lf = max(lf, l);         rg = min(rg, r);       }     }     if (B.size() == 0) {       if (lf == rg) {         cout << lf << endl;       } else         printf( Data not sufficient! n );       return 0;     }     for (int i = 0; i < B.size(); i++) {       long long int lf1 = B[i].lft, rg1 = B[i].rgt;       if (rg1 < lf || lf1 > rg)         continue;       else {         C.push_back(z(max(lf, lf1), min(rg, rg1)));       }     }     if (C.size() == 0) {       if (lf == rg) {         cout << lf << endl;       } else         printf( Data not sufficient! n );       return 0;     }     sort(C.begin(), C.end(), cmp1);     long long int ans = -1;     if (C[0].lft - 1 == lf) {       ans = lf;     } else if (lf + 1 < C[0].lft) {       printf( Data not sufficient! n );       return 0;     }     long long int Rgt = C[0].rgt;     for (int i = 1; i < C.size(); i++) {       long long int lf1 = C[i].lft, rg1 = C[i].rgt;       if (Rgt + 1 < C[i].lft) {         long long int dff = C[i].lft - Rgt - 1;         if (dff == 1) {           if (ans == -1) {             ans = Rgt + 1;           } else {             printf( Data not sufficient! n );             return 0;           }         } else {           printf( Data not sufficient! n );           return 0;         }       }       Rgt = max(Rgt, C[i].rgt);     }     if (rg >= Rgt + 1) {       if (rg == Rgt + 1) {         if (ans == -1) {           ans = rg;         } else {           printf( Data not sufficient! n );           return 0;         }       } else {         printf( Data not sufficient! n );         return 0;       }     }     if (ans == -1) {       printf( Game cheated! n );       return 0;     }     printf( %lld n , ans);     return 0;   }