func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD = 1000000007;   const long long UNDEF = -1;   const long long INF = 1e18;   template <typename T>   inline bool chkmax(T &aa, T bb) {     return aa < bb ? aa = bb, true : false;   }   template <typename T>   inline bool chkmin(T &aa, T bb) {     return aa > bb ? aa = bb, true : false;   }   static char stdinBuffer[1024];   static char *stdinDataEnd = stdinBuffer + sizeof(stdinBuffer);   static const char *stdinPos = stdinDataEnd;   void readAhead(size_t amount) {     size_t remaining = stdinDataEnd - stdinPos;     if (remaining < amount) {       memmove(stdinBuffer, stdinPos, remaining);       size_t sz = fread(stdinBuffer + remaining, 1,                         sizeof(stdinBuffer) - remaining, stdin);       stdinPos = stdinBuffer;       stdinDataEnd = stdinBuffer + remaining + sz;       if (stdinDataEnd != stdinBuffer + sizeof(stdinBuffer)) *stdinDataEnd = 0;     }   }   int rint() {     readAhead(16);     int x = 0;     bool neg = false;     while (*stdinPos ==     || *stdinPos ==   n ) ++stdinPos;     if (*stdinPos ==  - ) {       ++stdinPos;       neg = true;     }     while (*stdinPos >=  0  && *stdinPos <=  9 ) {       x *= 10;       x += *stdinPos -  0 ;       ++stdinPos;     }     return neg ? -x : x;   }   char rch() {     readAhead(16);     while (*stdinPos ==     || *stdinPos ==   n ) ++stdinPos;     char ans = *stdinPos;     ++stdinPos;     return ans;   }   long long rlong() {     readAhead(32);     long long x = 0;     bool neg = false;     while (*stdinPos ==     || *stdinPos ==   n ) ++stdinPos;     if (*stdinPos ==  - ) {       ++stdinPos;       neg = true;     }     while (*stdinPos >=  0  && *stdinPos <=  9 ) {       x *= 10;       x += *stdinPos -  0 ;       ++stdinPos;     }     return neg ? -x : x;   }   int nim(int x) { return x; }   map<int, map<int, int> > g[2];   map<int, vector<pair<int, int> > > z[2];   int lim[2];   map<int, pair<int, int> > h;   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     lim[0] = rint(), lim[1] = rint();     int k = rint();     for (int i = 0; i < k; i++) {       int xb = rint(), yb = rint(), xe = rint(), ye = rint();       if (xb == xe) {         if (yb > ye) swap(yb, ye);         g[0][xb][yb]++;         g[0][xb][ye]--;       } else {         if (xb > xe) swap(xb, xe);         g[1][yb][xb]++;         g[1][yb][xe]--;       }     }     int nimber = 0;     for (int t = 0; t < 2; t++)       for (auto &o : g[t]) {         int cnt = 0;         int last = 0;         int sumlen = 0;         for (auto &w : o.second) {           int oldcnt = cnt;           int pos = w.first;           cnt += w.second;           if (oldcnt == 0 && cnt > 0) {             int len = pos - last;             if (len) {               z[t][o.first].push_back(make_pair(last, pos));               sumlen += len;             }           }           if (oldcnt > 0 && cnt == 0) {             last = pos;           }         }         {           int pos = lim[t ^ 1];           int len = pos - last;           if (len) {             z[t][o.first].push_back(make_pair(last, pos));             sumlen += len;           }         }         h[sumlen] = make_pair(t, o.first);         nimber ^= sumlen;       }     for (int t = 0; t < 2; t++) {       int unseen = lim[t] - 1 - g[t].size();       int num = lim[t ^ 1];       if (unseen & 1) nimber ^= num;       if (unseen > 0) {         int have = -1;         int want = 1;         for (auto &w : g[t]) {           if (want != w.first) {             have = want;             break;           }           want++;         }         if (have == -1) have = lim[t] - 1;         assert(g[t].count(have) == 0);         h[num] = make_pair(t, have);         z[t][have].push_back(make_pair(0, lim[t ^ 1]));       }     }     if (nimber == 0) {       printf( SECOND n );     } else {       printf( FIRST n );       for (auto w : h) {         int len = w.first;         int go = len ^ nimber;         if (go > len) continue;         int rm = len - go;         int t = w.second.first;         int o = w.second.second;         int solution = -1;         for (auto &q : z[t][o]) {           int start = q.first, end = q.second;           if (rm <= end - start) {             solution = start + rm;             break;           } else             rm -= end - start;         }         assert(solution != -1);         if (t == 0) {           printf( %d %d %d %d n , o, 0, o, solution);         } else {           printf( %d %d %d %d n , 0, o, solution, o);         }         return 0;       }     }   }   