#include <bits/stdc++.h>
using namespace std;
const int STEP[8][2] = {{1, 2},  {2, 1},  {-1, 2},  {-2, 1},
                        {1, -2}, {2, -1}, {-1, -2}, {-2, -1}};
int N, M;
int dep[2][1003][1003];
inline void bfs(int x, int y, int flag) {
  dep[flag][x][y] = 1;
  queue<pair<int, int> > que;
  que.push(pair<int, int>(x, y));
  while (!que.empty()) {
    pair<int, int> u = que.front();
    que.pop();
    for (int i = 0; i < 8; ++i) {
      x = u.first + STEP[i][0];
      y = u.second + STEP[i][1];
      if (x >= 1 && y >= 1 && x <= N && y <= M && dep[flag][x][y] == 0) {
        dep[flag][x][y] = dep[flag][u.first][u.second] + 1;
        que.push(pair<int, int>(x, y));
      }
    }
  }
}
inline bool canMove(int x1, int y1, int x2, int y2) {
  x1 = abs(x1 - x2);
  y1 = abs(y1 - y2);
  if (x1 == 1 && y1 == 2) return 1;
  if (x1 == 2 && y1 == 1) return 1;
  return 0;
}
inline long long dist(int x, int y, int x1, int y1) {
  return abs(x - x1) + abs(y - y1);
}
inline int getChose(int x1, int y1, int x2, int y2, int first) {
  if (canMove(x1, y1, x2, y2)) return first;
  if (dep[first][x1][y1] >= dep[first][x2][y2] &&
      (dep[first][x1][y1] - dep[first][x2][y2]) % 2 == 0)
    return first ^ 1;
  if (dep[first ^ 1][x2][y2] >= dep[first ^ 1][x1][y1] - 1 &&
      (dep[first ^ 1][x2][y2] - dep[first ^ 1][x1][y1] + 1) % 2 == 0)
    return first;
  if (dep[first][x1][y1] <= dep[first ^ 1][x2][y2]) return first;
  return first ^ 1;
}
inline int getNext(int x, int y, int x1, int y1, int flag, int& ansx, int& ansy,
                   int x2, int y2) {
  if (canMove(x, y, x2, y2)) {
    ansx = x2;
    ansy = y2;
    return 1;
  }
  ansx = ansy = -1;
  for (int i = 0; i < 8; ++i) {
    int xx = x + STEP[i][0];
    int yy = y + STEP[i][1];
    if (xx >= 1 && yy >= 1 && xx <= N && yy <= M) {
      if (getChose(x2, y2, xx, yy, flag ^ 1) != flag ^ 1)
        if (ansx == -1 || dep[flag][ansx][ansy] > dep[flag][xx][yy]) {
          ansx = xx;
          ansy = yy;
        }
    }
  }
  return ansx == x1 && ansy == y1;
}
int main() {
  scanf("%d %d", &N, &M);
  bfs(N >> 1, M >> 1, 0);
  bfs((N >> 1) + 1, M >> 1, 1);
  int x1, y1, x2, y2;
  scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
  int chose = getChose(x1, y1, x2, y2, 0);
  if (chose == 0)
    puts("WHITE");
  else
    puts("BLACK");
  fflush(stdout);
  if (chose) scanf("%d %d", &x1, &y1);
  int x, y;
  for (int i = 0; i < 360; ++i) {
    int have = 0;
    if (chose == 0) {
      have = getNext(x1, y1, N >> 1, M >> 1, 0, x, y, x2, y2);
      x1 = x;
      y1 = y;
    } else {
      have = getNext(x2, y2, (N >> 1) + 1, M >> 1, 1, x, y, x1, y1);
      x2 = x;
      y2 = y;
    }
    printf("%d %d\n", x, y);
    fflush(stdout);
    if (x < 1 || y < 1 || x > N || y > M) assert(1 == 0);
    if (x1 == x2 && y1 == y2) break;
    if ((x1 == (N >> 1)) && (y1 == (M >> 1)) &&
        !canMove(x2, y2, N >> 1, M >> 1))
      break;
    if ((x2 == (N >> 1) + 1) && (y2 == (M >> 1)) &&
        !canMove(x1, y1, (N >> 1) + 1, M >> 1))
      break;
    if (chose == 0)
      scanf("%d %d", &x2, &y2);
    else
      scanf("%d %d", &x1, &y1);
    if (x1 == x2 && y1 == y2) assert(1 == 0);
    if ((x1 == (N >> 1)) && (y1 == (M >> 1)) &&
        !canMove(x2, y2, N >> 1, M >> 1))
      assert(1 == 0);
    if ((x2 == (N >> 1) + 1) && (y2 == (M >> 1)) &&
        !canMove(x1, y1, (N >> 1) + 1, M >> 1))
      assert(1 == 0);
    if (have) break;
    if (i > 355)
      while (1)
        ;
  }
  return 0;
}
