#include <bits/stdc++.h>
using namespace std;
int dp[251][251][4][4];
pair<int, int> nxt[251][251][4][4];
vector<pair<int, int> > ret;
int solve2(int s1, int s2, int g1, int g2) {
  if (g1 == 0 && g2 == 0) {
    return (s1 == 0 && s2 == 0 ? 1 : 0);
  }
  if (s1 == 0 && s2 == 0) return 0;
  if (dp[s1][s2][g1][g2] == -1) {
    dp[s1][s2][g1][g2] = 0;
    int ma = (max(g1, g2) == 3 && min(g1, g2) == 2 ? 15 : 25);
    if (g2 != 3 && g1 > 0) {
      for (int i = ma; i <= s1; i++)
        if (dp[s1][s2][g1][g2] == 0) {
          int low = 0, high = min(s2, i - 2);
          if (i != ma) low = i - 2;
          for (int j = low; j <= high; j++) {
            int val = solve2(s1 - i, s2 - j, g1 - 1, g2);
            if (val) {
              dp[s1][s2][g1][g2] = 1;
              nxt[s1][s2][g1][g2] = make_pair(i, j);
              break;
            }
          }
        }
    }
    if (dp[s1][s2][g1][g2] == 0 && g1 != 3 && g2 > 0) {
      for (int i = ma; i <= s2; i++)
        if (dp[s1][s2][g1][g2] == 0) {
          int low = 0, high = min(s1, i - 2);
          if (i != ma) low = i - 2;
          for (int j = low; j <= high; j++) {
            int val = solve2(s1 - j, s2 - i, g1, g2 - 1);
            if (val) {
              dp[s1][s2][g1][g2] = 1;
              nxt[s1][s2][g1][g2] = make_pair(j, i);
              break;
            }
          }
        }
    }
  }
  return dp[s1][s2][g1][g2];
}
int a, b;
void trace(int s1, int s2, int g1, int g2) {
  if (g1 == 0 && g2 == 0) return;
  auto w = nxt[s1][s2][g1][g2];
  ret.push_back(w);
  if (w.first > w.second) {
    trace(s1 - w.first, s2 - w.second, g1 - 1, g2);
  } else {
    trace(s1 - w.first, s2 - w.second, g1, g2 - 1);
  }
}
void solve() {
  scanf("%d%d", &a, &b);
  ret.clear();
  for (int i = 0; i <= 2; i++)
    if (solve2(a, b, 3, i) == 1) {
      printf("3:%d\n", i);
      trace(a, b, 3, i);
      for (int i = (int)(ret.size()) - 1; i >= 0; i--)
        printf("%d:%d%c", ret[i].first, ret[i].second, (i == 0 ? '\n' : ' '));
      return;
    }
  for (int i = 2; i >= 0; i--)
    if (solve2(a, b, i, 3) == 1) {
      printf("%d:3\n", i);
      trace(a, b, i, 3);
      for (int i = (int)(ret.size()) - 1; i >= 0; i--)
        printf("%d:%d%c", ret[i].first, ret[i].second, (i == 0 ? '\n' : ' '));
      return;
    }
  puts("Impossible");
}
int main() {
  int t;
  scanf("%d", &t);
  for (int i = 0; i <= 200; i++)
    for (int j = 0; j <= 200; j++)
      for (int l = 0; l <= 3; l++)
        for (int p = 0; p <= 3; p++) dp[i][j][l][p] = -1;
  while (t--) solve();
}
