#include <bits/stdc++.h>
using namespace std;
int n, m;
inline bool Valid(int x, int y) { return x >= 1 && y >= 1 && x <= n && y <= m; }
struct tPos {
  int x, y;
  tPos operator+(const tPos &b) const { return {x + b.x, y + b.y}; }
  bool Valid() const { return ::Valid(x, y); }
};
const tPos dir[8] = {1, 2, 1, -2, -1, 2, -1, -2, 2, 1, 2, -1, -2, 1, -2, -1};
tPos white, black;
const int64_t WHITE_WIN = 0x7F00000000000000ll;
const int64_t BLACK_WIN = -WHITE_WIN;
inline bool CanAttack(tPos white, tPos black) {
  for (int i = 0; i < 8; ++i) {
    if (white.x + dir[i].x == black.x && white.y + dir[i].y == black.y) {
      return true;
    }
  }
  return false;
}
struct tStatus {
  tPos white, black;
  bool bWhiteTurn;
};
struct tResult {
  char result[41][41][41][41][2];
  char &operator[](const tStatus &idx) {
    return result[idx.white.x][idx.white.y][idx.black.x][idx.black.y]
                 [idx.bWhiteTurn];
  }
  char &operator()(tPos white, tPos black, bool bWhiteTurn) {
    return result[white.x][white.y][black.x][black.y][bWhiteTurn];
  }
};
static tResult result;
void BFS2() {
  static int aiCount[41][41];
  queue<tStatus> list;
  int BFSCount = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) {
      for (int k = 0; k < 8; ++k) {
        if (Valid(i + dir[k].x, j + dir[k].y)) aiCount[i][j]++;
      }
      result.result[i][j][i][j][0] = 11;
      result.result[i][j][i][j][1] = -11;
      list.push({i, j, i, j, 0});
      list.push({i, j, i, j, 1});
      if (!CanAttack({i, j}, {n / 2, m / 2})) {
        result.result[n / 2][m / 2][i][j][0] = 11;
        list.push({n / 2, m / 2, i, j, 0});
      }
      if (!CanAttack({i, j}, {n / 2 + 1, m / 2})) {
        result.result[i][j][n / 2 + 1][m / 2][1] = -11;
        list.push({i, j, n / 2 + 1, m / 2, 1});
      }
    }
  while (!list.empty()) {
    tStatus stat = list.front();
    list.pop();
    char r = result[stat];
    if (stat.bWhiteTurn) {
      if (r < 0) {
        for (int i = 0; i < 8; ++i) {
          tPos pre = stat.black + dir[i];
          if (pre.Valid() &&
              abs(result(stat.white, pre, !stat.bWhiteTurn)) < 10) {
            result(stat.white, pre, !stat.bWhiteTurn) = r - 1;
            list.push({stat.white, pre, !stat.bWhiteTurn});
          }
        }
      } else {
        for (int i = 0; i < 8; ++i) {
          tPos pre = stat.black + dir[i];
          if (pre.Valid() &&
              abs(result(stat.white, pre, !stat.bWhiteTurn)) < 10) {
            if (++result(stat.white, pre, !stat.bWhiteTurn) ==
                aiCount[pre.x][pre.y]) {
              result(stat.white, pre, !stat.bWhiteTurn) = r + 1;
              list.push({stat.white, pre, !stat.bWhiteTurn});
            }
          }
        }
      }
    } else {
      if (r > 0) {
        for (int i = 0; i < 8; ++i) {
          tPos pre = stat.white + dir[i];
          if (pre.Valid() &&
              abs(result(pre, stat.black, !stat.bWhiteTurn)) < 10) {
            result(pre, stat.black, !stat.bWhiteTurn) = r + 1;
            list.push({pre, stat.black, !stat.bWhiteTurn});
          }
        }
      } else {
        for (int i = 0; i < 8; ++i) {
          tPos pre = stat.white + dir[i];
          if (pre.Valid() &&
              abs(result(pre, stat.black, !stat.bWhiteTurn)) < 10) {
            if (++result(pre, stat.black, !stat.bWhiteTurn) ==
                aiCount[pre.x][pre.y]) {
              result(pre, stat.black, !stat.bWhiteTurn) = r - 1;
              list.push({pre, stat.black, !stat.bWhiteTurn});
            }
          }
        }
      }
    }
  }
}
int main() {
  scanf("%d %d", &n, &m);
  BFS2();
  scanf("%d %d %d %d", &white.x, &white.y, &black.x, &black.y);
  bool bSelectWhite;
  if (result[{white, black, 1}] >= 10) {
    puts("WHITE");
    bSelectWhite = true;
  } else if (result[{white, black, 1}] <= -10) {
    puts("BLACK");
    bSelectWhite = false;
  } else {
    abort();
  }
  fflush(stdout);
  if (!bSelectWhite) {
    scanf("%d %d", &white.x, &white.y);
  }
  while (true) {
    if (black.x == white.x && black.y == white.y) return 0;
    if (white.x == n / 2 && white.y == m / 2 && !CanAttack(white, black))
      return 0;
    if (black.x == n / 2 + 1 && black.y == m / 2 && !CanAttack(white, black))
      return 0;
    tPos next;
    int i;
    char r = result[{white, black, bSelectWhite}];
    for (i = 0; i < 8; ++i) {
      if (bSelectWhite) {
        assert(r > 0);
        next = white + dir[i];
        if (next.Valid() && result[{next, black, !bSelectWhite}] == r - 1)
          break;
      } else {
        assert(r < 0);
        next = black + dir[i];
        if (next.Valid() && result[{white, next, !bSelectWhite}] == r + 1)
          break;
      }
    }
    assert(i < 8);
    printf("%d %d\n", next.x, next.y);
    fflush(stdout);
    if (bSelectWhite)
      white = next;
    else
      black = next;
    if (black.x == white.x && black.y == white.y) return 0;
    if (white.x == n / 2 && white.y == m / 2 && !CanAttack(white, black))
      return 0;
    if (black.x == n / 2 + 1 && black.y == m / 2 && !CanAttack(white, black))
      return 0;
    if (bSelectWhite)
      scanf("%d %d", &black.x, &black.y);
    else
      scanf("%d %d", &white.x, &white.y);
  }
  return 0;
}
