#include <bits/stdc++.h>
using namespace std;
struct node {
  int a, b, c;
  node() = default;
  node(int x, int y, int z) : a(x), b(y), c(z) {}
} s[1000];
struct mask {
  int d1, d2;
  mask() = default;
  mask(int a, int b) : d1(a), d2(b) {}
  bool operator<(const mask &t) const {
    if (d1 != t.d1) return d1 < t.d1;
    return d2 < t.d2;
  }
};
struct keep {
  int v1, v2, v3;
  keep(int v1 = 0, int v2 = 0, int v3 = 0) {}
  vector<int> vct;
} statu;
map<mask, keep> mp;
void DFS_1(int x, int y) {
  if (x >= y + 1) {
    int t1 = statu.v2 - statu.v1, t2 = statu.v3 - statu.v2;
    if (mp.find(mask(t1, t2)) == mp.end())
      mp[mask(t1, t2)] = statu;
    else {
      keep &p = mp[mask(t1, t2)];
      if (p.v1 < statu.v1) mp[mask(t1, t2)] = statu;
    }
    return;
  }
  statu.v1 += s[x].a;
  statu.v2 += s[x].b;
  statu.vct.push_back(12);
  DFS_1(x + 1, y);
  statu.v1 -= s[x].a;
  statu.v2 -= s[x].b;
  statu.vct.pop_back();
  statu.v2 += s[x].b;
  statu.v3 += s[x].c;
  statu.vct.push_back(23);
  DFS_1(x + 1, y);
  statu.v2 -= s[x].b;
  statu.v3 -= s[x].c;
  statu.vct.pop_back();
  statu.v1 += s[x].a;
  statu.v3 += s[x].c;
  statu.vct.push_back(13);
  DFS_1(x + 1, y);
  statu.v1 -= s[x].a;
  statu.v3 -= s[x].c;
  statu.vct.pop_back();
}
int v_ans;
vector<int> ans;
void DFS_2(int x, int y) {
  if (x == y + 1) {
    int t1 = statu.v2 - statu.v1, t2 = statu.v3 - statu.v2;
    if (mp.find(mask(-t1, -t2)) == mp.end()) return;
    keep &p = mp[mask(-t1, -t2)];
    int sv1 = statu.v1 + p.v1;
    int sv2 = statu.v2 + p.v2;
    int sv3 = statu.v3 + p.v3;
    if (sv1 > v_ans) {
      v_ans = sv1;
      ans.clear();
      ans = p.vct;
      for (int j = 0; j < statu.vct.size(); j++) ans.push_back(statu.vct[j]);
    }
    return;
  }
  statu.v1 += s[x].a;
  statu.v2 += s[x].b;
  statu.vct.push_back(12);
  DFS_2(x + 1, y);
  statu.v1 -= s[x].a;
  statu.v2 -= s[x].b;
  statu.vct.pop_back();
  statu.v2 += s[x].b;
  statu.v3 += s[x].c;
  statu.vct.push_back(23);
  DFS_2(x + 1, y);
  statu.v2 -= s[x].b;
  statu.v3 -= s[x].c;
  statu.vct.pop_back();
  statu.v1 += s[x].a;
  statu.v3 += s[x].c;
  statu.vct.push_back(13);
  DFS_2(x + 1, y);
  statu.v1 -= s[x].a;
  statu.v3 -= s[x].c;
  statu.vct.pop_back();
}
inline void print(int x) {
  if (x == 1)
    putchar('L');
  else if (x == 2)
    putchar('M');
  else
    putchar('W');
}
int main() {
  int n, i, j, k;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) scanf("%d%d%d", &s[i].a, &s[i].b, &s[i].c);
  if (n == 1) {
    if (s[1].a == 0 && s[1].b == 0)
      printf("LM\n");
    else if (s[1].b == 0 && s[1].c == 0)
      printf("MW\n");
    else if (s[1].a == 0 && s[1].c == 0)
      printf("LW\n");
    else
      printf("Impossible\n");
    return 0;
  }
  v_ans = -(1 << 30);
  statu.v1 = statu.v2 = statu.v3 = 0;
  statu.vct.clear();
  DFS_1(1, n / 2);
  statu.v1 = statu.v2 = statu.v3 = 0;
  statu.vct.clear();
  DFS_2(n / 2 + 1, n);
  if (v_ans == -(1 << 30)) {
    printf("Impossible\n");
    return 0;
  }
  for (i = 0; i < n; i++) {
    print(ans[i] / 10);
    print(ans[i] % 10);
    putchar('\n');
  }
  return 0;
}
