#include <bits/stdc++.h>
const int N = 1005;
const std::pair<int, int> d[8] = {{1, 2}, {1, -2}, {-1, 2}, {-1, -2},
                                  {2, 1}, {2, -1}, {-2, 1}, {-2, -1}};
int n, m;
std::pair<int, int> start[2], end[2];
std::pair<int, int> operator+(std::pair<int, int> a, std::pair<int, int> b) {
  return std::pair<int, int>(a.first + b.first, a.second + b.second);
}
bool parity(std::pair<int, int> p) { return p.first + p.second & 1; }
bool over_range(std::pair<int, int> p) {
  return p.first < 1 || p.first > n || p.second < 1 || p.second > m;
}
struct map {
  int dis[N][N];
  std::pair<int, int> from[N][N];
  bool vis[N][N];
  std::pair<int, int> start;
  void bfs(std::pair<int, int> s, int first) {
    std::memset(dis, 0x3f, sizeof dis);
    vis[s.first][s.second] = 1, start = s;
    dis[s.first][s.second] = first;
    std::queue<std::pair<int, int> > q;
    q.emplace(s);
    while (q.size()) {
      std::pair<int, int> first = q.front();
      q.pop();
      for (int k = 0; k < 8; ++k) {
        std::pair<int, int> second = first + d[k];
        if (over_range(second)) continue;
        if (vis[second.first][second.second]) continue;
        vis[second.first][second.second] = 1;
        from[second.first][second.second] = first;
        dis[second.first][second.second] = dis[first.first][first.second] + 2;
        q.emplace(second);
      }
    }
  }
  std::vector<std::pair<int, int> > get_path(std::pair<int, int> end) {
    std::vector<std::pair<int, int> > ret;
    while (end != start) {
      ret.emplace_back(end);
      end = from[end.first][end.second];
    }
    std::reverse(ret.begin(), ret.end());
    return ret;
  }
} data[2];
int dis[2][2], chess;
std::pair<int, int> opponent, self;
void read_pos() { std::cin >> opponent.first >> opponent.second; }
void choose(bool color) {
  std::cout << (color ? "BLACK" : "WHITE") << std::endl, chess = color;
  self = start[chess], opponent = start[chess ^ 1];
  if (color) read_pos();
}
void move_to(std::pair<int, int> p) {
  for (int i = 0; i < 8; ++i)
    if (self + d[i] == opponent)
      std::cout << opponent.first << ' ' << opponent.second << std::endl,
          std::exit(0);
  self = p, std::cout << self.first << ' ' << self.second << std::endl;
}
int main() {
  std::ios::sync_with_stdio(0), std::cin.tie(0);
  std::cin >> n >> m;
  end[0] = std::pair<int, int>(n >> 1, m >> 1);
  end[1] = std::pair<int, int>((n >> 1) + 1, m >> 1);
  std::cin >> start[0].first >> start[0].second;
  std::cin >> start[1].first >> start[1].second;
  data[0].bfs(start[0], 0), data[1].bfs(start[1], 1);
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
      dis[i][j] = data[i].dis[end[j].first][end[j].second];
  for (int i = 0; i < 2; ++i)
    if (dis[i][i] - dis[i ^ 1][i] <= -3 && dis[i][i] < dis[i ^ 1][i ^ 1]) {
      choose(i);
      auto ret = data[i].get_path(end[i]);
      for (int j = 0; j < ret.size(); ++j) {
        if (j) read_pos();
        move_to(ret[j]);
      }
      return 0;
    }
  choose(parity(start[0]) == parity(start[1]));
  if (dis[chess][chess] < dis[chess ^ 1][chess ^ 1]) {
    auto ret = data[chess].get_path(end[chess]);
    for (int j = 0; j < ret.size(); ++j) {
      if (j) read_pos();
      move_to(ret[j]);
    }
    return 0;
  }
  auto ret = data[chess].get_path(end[chess ^ 1]);
  for (int j = 0; j < ret.size(); ++j) move_to(ret[j]), read_pos();
  move_to(end[chess] + std::pair<int, int>(0, 2)), read_pos();
  move_to(end[chess] +
          (chess ? std::pair<int, int>(2, 1) : std::pair<int, int>(-2, 1))),
      read_pos();
  move_to(end[chess]);
  return 0;
}
