#include <bits/stdc++.h>
#pragma optimize(0)
using namespace std;
int dp[7][7][303][303];
struct Node {
  int win, loss, firsco, secsco;
  Node() { win = loss = firsco = secsco = 0; }
  Node(int xwin, int xloss, int xfirsco, int xsecsco) {
    win = xwin;
    loss = xloss;
    firsco = xfirsco;
    secsco = xsecsco;
  }
};
Node way[7][7][303][303];
int dfs(int dep, int win, int los, int fir, int sec, int la = 0) {
  if (win < 0 || los < 0 || fir < 0 || sec < 0) return 0;
  int *p = &dp[win][los][fir][sec];
  if (*p != -1) return *p;
  if (!dep) return *p = 0;
  if (!la && (win >= 3 || los >= 3)) return *p = 0;
  if (((dep - 1) * 25 + ((dep == 5) ? 15 : 25)) > fir + sec) return *p = 0;
  int sta = (dep == 5) ? 15 : 25;
  for (int i = 0; i < sta - 1; i++) {
    if (los != 3) {
      int x = dfs(dep - 1, win - 1, los, fir - sta, sec - i);
      if (x) {
        *p = 1;
        way[win][los][fir][sec] = Node(win - 1, los, fir - sta, sec - i);
        return 1;
      }
    }
    if (win != 3) {
      int y = dfs(dep - 1, win, los - 1, fir - i, sec - sta);
      if (y) {
        *p = 1;
        way[win][los][fir][sec] = Node(win, los - 1, fir - i, sec - sta);
        return 1;
      }
    }
  }
  for (int i = sta - 1; i <= min(fir, sec) && i <= max(fir, sec) - 2; i++) {
    if (los != 3) {
      int x = dfs(dep - 1, win - 1, los, fir - i - 2, sec - i);
      if (x) {
        *p = 1;
        way[win][los][fir][sec] = Node(win - 1, los, fir - i - 2, sec - i);
        return 1;
      }
    }
    if (win != 3) {
      int y = dfs(dep - 1, win, los - 1, fir - i, sec - i - 2);
      if (y) {
        *p = 1;
        way[win][los][fir][sec] = Node(win, los - 1, fir - i, sec - i - 2);
        return 1;
      }
    }
  }
  return *p = 0;
}
int main() {
  memset(dp, -1, sizeof dp);
  dp[0][0][0][0] = 1;
  int T;
  cin >> T;
  for (int a = 0; a <= 200; a++)
    for (int b = 0; b <= 200; b++)
      for (int i = 3; i <= 5; i++) {
        for (int j = 0; j <= i; j++) {
          if (j < 3 && i - j < 3) continue;
          if (j > 3 || i - j > 3) continue;
          int x = dfs(i, j, i - j, a, b, 1);
          if (!x) continue;
        }
      }
  while (T--) {
    int a, b;
    cin >> a >> b;
    int maxid1, maxid2, maxval = -1;
    for (int i = 3; i <= 5; i++) {
      for (int j = 0; j <= i; j++) {
        if (j < 3 && i - j < 3) continue;
        if (j > 3 || i - j > 3) continue;
        int x = dfs(i, j, i - j, a, b, 1);
        if (!x) continue;
        if (j > maxval) {
          maxval = j;
          maxid1 = j;
          maxid2 = i - j;
        }
      }
    }
    if (maxval == -1)
      cout << "Impossible\n";
    else {
      cout << maxid1 << ":" << maxid2 << "\n";
      vector<pair<int, int> > res;
      res.clear();
      int w1 = maxid1, w2 = maxid2, w3 = a, w4 = b;
      for (int i = maxid1 + maxid2; i > 0; i--) {
        int nw1 = way[w1][w2][w3][w4].win, nw2 = way[w1][w2][w3][w4].loss,
            nw3 = way[w1][w2][w3][w4].firsco, nw4 = way[w1][w2][w3][w4].secsco;
        res.push_back(make_pair(w3 - nw3, w4 - nw4));
        w1 = nw1;
        w2 = nw2;
        w3 = nw3;
        w4 = nw4;
      }
      reverse(res.begin(), res.end());
      for (int i = 0; i < res.size(); i++) {
        cout << res[i].first << ":" << res[i].second << " ";
      }
      cout << endl;
    }
  }
}
