#include <cstdio>
#include <vector>
using namespace std;
vector<int> numbers;
vector<int> v1, v2;
void mySwap(int &num1, int &num2)
{
int tmp = num1;
num1 = num2;
num2 = tmp;
}
// Mozheshe da sortirame s vgradenia sort, no tuk
// demonstrirame sortirane :)
void mySort(vector<int> &toSort)
{
for(int i = 0; i < toSort.size(); i++)
{
for(int j = i + 1; j < toSort.size(); j++)
{
if(toSort[j] < toSort[i])
{
mySwap(toSort[j], toSort[i]);
}
}
}
}
int main()
{
int tests;
scanf("%d",&tests);
while(tests--)
{
int numElem;
int lineX;
int tmpNum;
// Vazhno e kato se polzvat vektori i imame mnogo testove,
// da gi chistim ot starite dannite za vseki test
numbers.clear();
v1.clear();
v2.clear();
scanf("%d %d", &numElem, &lineX);
for(int i = 0; i < numElem; i++)
{
scanf("%d", &tmpNum);
// Slagame vsichki chisla v edin masiv
numbers.push_back(tmpNum);
}
// Sortirame samo vednyzh
mySort(numbers);
// Tuk razdeliame chislata na dve chasti
for (int i = 0; i < numbers.size(); i++)
{
if (numbers[i] < lineX)
{
v1.push_back(numbers[i]);
}
else
{
v2.push_back(numbers[i]);
}
}
// Obhozhdame vtoria masiv v prav red
for(int i = 0; i < v1.size(); i++)
{
printf("%d", v1[i]);
// Pravim tezi neshta po-dolu, zad a izpisvame adekvatni novi redove i
// shpacii v izhoda
if (i != v1.size()-1)
printf(" ");
else if (v2.size() > 0)
printf(" ");
else
printf("\n");
}
// Obhozhdame vtoria masiv v obraten red
for(int i = v2.size() - 1; i >= 0; i--)
{
printf("%d",v2[i]);
// Pravim tezi neshta po-dolu, zad a izpisvame adekvatni novi redove i
// shpacii v izhoda
if (i == 0)
printf("\n");
else
printf(" ");
}
}
return 0;
}