/*
* hdu2184/win.cpp
* Created on: 2012-8-2
* Author : ben
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <functional>
#include <numeric>
#include <cctype>
using namespace std;
typedef unsigned long long I64u;
typedef stack<int> ms;
I64u powoftwo[64];
void init() {
powoftwo[0] = 0;
for(int i = 1; i < 64; i++) {
powoftwo[i] = powoftwo[i - 1] * 2 + 1;
}
}
int fun(I64u m) {
for(int i = 0; i < 64; i++) {
if(m == powoftwo[i]) {
return i;
}
}
for(int i = 63; i >= 0; i--) {
if(m > powoftwo[i]) {
return -i;
}
}
return 0;
}
void mymove(ms &sa, ms &sc, int n) {
ms temp;
for(int i = 0; i < n; i++) {
temp.push(sa.top());
sa.pop();
}
for(int i = 0; i < n; i++) {
sc.push(temp.top());
temp.pop();
}
}
void work(ms &sa, ms &sb, ms &sc, int n, I64u m) {
I64u ret = powoftwo[n - 1];
if(m < ret) {
work(sa, sc, sb, n - 1, m);
return ;
}
mymove(sa, sb, n - 1);
m -= ret;
if(m > 0) {
mymove(sa, sc, 1);
m--;
}
if(m > 0) {
work(sb, sa, sc, n - 1, m);
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
#endif
int T, n;
init();
scanf("%d", &T);
I64u m;
while(T--) {
scanf("%d%I64u", &n, &m);
stack<int> s[3];
for(int i = n; i > 0; i--) {
s[0].push(i);
}
work(s[0], s[1], s[2], n, m);
for(int i = 0; i < 3; i++) {
int size = s[i].size();
printf("%d", size);
ms temps;
while(!s[i].empty()) {
temps.push(s[i].top());
s[i].pop();
}
for(int j = 0; j < size; j++) {
printf(" %d", temps.top());
temps.pop();
}
putchar('\n');
}
}
return 0;
}