#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
typedef struct cut_ST {
  int r1, r2, c1, c2;
} Segment;
int R, C, K;
vector<Segment> rowcuts;
vector<Segment> colcuts;
bool cmpr(Segment A, Segment B) {
  if (A.r1 != B.r1) return A.r1 < B.r1;
  return A.c1 < B.c1;
}
bool cmpc(Segment A, Segment B) {
  if (A.c1 != B.c1) return A.c1 < B.c1;
  return A.r1 < B.r1;
}
int cut(vector<PII> segs) {
  int cutTo = 0;
  int res = 0;
  int sz = segs.size();
  for (int i = 0; i < sz; i++) {
    if (segs[i].first > cutTo) res += segs[i].first - cutTo;
    cutTo = max(cutTo, segs[i].second);
  }
  return res;
}
Segment firstMove;
void computeCut(int isRow, int at, vector<PII> segs, int todo) {
  int cutTo = 0;
  int res = 0;
  int sz = segs.size();
  for (int i = 0; i < sz; i++) {
    if (segs[i].first > cutTo) res += segs[i].first - cutTo;
    if (res >= todo) {
      todo = segs[i].first - (res - todo);
      break;
    }
    cutTo = max(cutTo, segs[i].second);
  }
  if (isRow) {
    firstMove.r1 = firstMove.r2 = at;
    firstMove.c1 = 0;
    firstMove.c2 = todo;
  } else {
    firstMove.c1 = firstMove.c2 = at;
    firstMove.r1 = 0;
    firstMove.r2 = todo;
  }
}
int nim(int grundy2) {
  int grundy = 0;
  int i, j, sz;
  vector<int> cut_at_cols;
  vector<int> cut_at_rows;
  sz = rowcuts.size();
  for (i = 0; i < sz; i = j) {
    vector<PII> segs;
    for (j = i; j < sz && rowcuts[i].r1 == rowcuts[j].r1; j++)
      segs.push_back(PII(rowcuts[j].c1, rowcuts[j].c2));
    segs.push_back(PII(C, C));
    int totalLeft = cut(segs);
    grundy ^= totalLeft;
    cut_at_rows.push_back(rowcuts[i].r1);
    if (grundy2 != -1) {
      if ((totalLeft ^ grundy2) < totalLeft) {
        int todo = totalLeft - (totalLeft ^ grundy2);
        computeCut(1, rowcuts[i].r1, segs, todo);
        return 0;
      }
    }
  }
  sz = colcuts.size();
  for (i = 0; i < sz; i = j) {
    vector<PII> segs;
    for (j = i; j < sz && colcuts[i].c1 == colcuts[j].c1; j++)
      segs.push_back(PII(colcuts[j].r1, colcuts[j].r2));
    segs.push_back(PII(R, R));
    int totalLeft = cut(segs);
    grundy ^= totalLeft;
    cut_at_cols.push_back(colcuts[i].c1);
    if (grundy2 != -1) {
      if ((totalLeft ^ grundy2) < totalLeft) {
        int todo = totalLeft - (totalLeft ^ grundy2);
        computeCut(0, colcuts[i].c1, segs, todo);
        return 0;
      }
    }
  }
  if ((C - 1 - cut_at_cols.size()) % 2) grundy ^= R;
  if ((R - 1 - cut_at_rows.size()) % 2) grundy ^= C;
  if (grundy2 != -1) {
    if ((grundy2 ^ C) < C) {
      sz = cut_at_rows.size();
      int todo = C - (grundy2 ^ C);
      for (i = 1; i <= sz; i++) {
        if (i != cut_at_rows[i - 1]) {
          break;
        }
      }
      firstMove.r1 = firstMove.r2 = i;
      firstMove.c1 = 0;
      firstMove.c2 = todo;
      return 0;
    }
    if ((grundy2 ^ R) < R) {
      sz = cut_at_cols.size();
      int todo = R - (grundy2 ^ R);
      for (i = 1; i <= sz; i++) {
        if (i != cut_at_cols[i - 1]) {
          break;
        }
      }
      firstMove.c1 = firstMove.c2 = i;
      firstMove.r1 = 0;
      firstMove.r2 = todo;
      return 0;
    }
  }
  return grundy;
}
int main() {
  scanf("%d %d %d", &R, &C, &K);
  for (int i = 0; i < K; i++) {
    Segment cut;
    scanf("%d %d %d %d", &cut.r1, &cut.c1, &cut.r2, &cut.c2);
    if (cut.r1 == cut.r2) {
      if (cut.c1 > cut.c2) swap(cut.c1, cut.c2);
      rowcuts.push_back(cut);
    } else {
      if (cut.r1 > cut.r2) swap(cut.r1, cut.r2);
      colcuts.push_back(cut);
    }
  }
  sort(rowcuts.begin(), rowcuts.end(), cmpr);
  sort(colcuts.begin(), colcuts.end(), cmpc);
  int grundy = nim(-1);
  if (!grundy) {
    printf("SECOND\n");
  } else {
    nim(grundy);
    printf("FIRST\n");
    printf("%d %d %d %d\n", firstMove.r1, firstMove.c1, firstMove.r2,
           firstMove.c2);
  }
  return 0;
}
