rt.
#include<bits/stdc++.h>
using namespace std;
struct node{
int a, b;
node(int x, int y){a = x, b = y;}
};
int d[5][5][210][210], T;
vector<node> v[5][5][210][210];
void init(){
d[0][0][0][0] = 1;
for(int sum = 0; sum <= 4; sum++)
for(int l = 0; l <= sum; l++){
int r = sum - l;
int k = 25;
if(sum == 4) k = 15;
if(max(l, r) >= 3) continue;
for(int i = 0; i <= 200; i++)
for(int j = 0; j <= 200; j++){
if(!d[l][r][i][j]) continue;
for(int p = k; p <= 200; p++){
if(i + p <= 200 && j + p - 2 <= 200 && !d[l + 1][r][i + p][j + p - 2]){
d[l + 1][r][i + p][j + p - 2] = 1;
v[l + 1][r][i + p][j + p - 2] = v[l][r][i][j];
v[l + 1][r][i + p][j + p - 2].push_back(node(p, p - 2));
}
if(i + p - 2 <= 200 && j + p <= 200 && !d[l][r + 1][i + p - 2][j + p]){
d[l][r + 1][i + p - 2][j + p] = 1;
v[l][r + 1][i + p - 2][j + p] = v[l][r][i][j];
v[l][r + 1][i + p - 2][j + p].push_back(node(p - 2, p));
}
}
for(int p = 0; p <= k - 2; p++){
if(i + k <= 200 && j + p <= 200 && !d[l + 1][r][i + k][j + p]){
d[l + 1][r][i + k][j + p] = 1;
v[l + 1][r][i + k][j + p] = v[l][r][i][j];
v[l + 1][r][i + k][j + p].push_back(node(k, p));
}
if(i + p <= 200 && j + k <= 200 && !d[l][r + 1][i + p][j + k]){
d[l][r + 1][i + p][j + k] = 1;
v[l][r + 1][i + p][j + k] = v[l][r][i][j];
v[l][r + 1][i + p][j + k].push_back(node(p,k));
}
}
}
}
}
int main(){
init();
scanf("%d",&T);
while(T--){
int a, b, l = -1, r = -1;
scanf("%d%d", &a, &b);
if(d[3][0][a][b]) l = 3, r = 0;
else if(d[3][1][a][b]) l = 3, r = 1;
else if(d[3][2][a][b]) l = 3, r = 2;
else if(d[2][3][a][b]) l = 2, r = 3;
else if(d[1][3][a][b]) l = 1, r = 3;
else if(d[0][3][a][b]) l = 0, r = 3;
if(l == -1) puts("Impossible");
else{
printf("%d:%d\n", l, r);
printf("%d:%d", v[l][r][a][b][0].a, v[l][r][a][b][0].b);
for(int i = 1; i < v[l][r][a][b].size(); i++)
printf(" %d:%d ", v[l][r][a][b][i].a, v[l][r][a][b][i].b);
puts("");
}
}
return 0;
}