// Tuk e realizirano reshenieto s edna dunkcia za sortirane, koiato prilagame dva pyti
// vyrhu chislata, koito sa po-malko ot X i tezi, koito sa po-golemi ili ravni
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
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;
v1.clear();
v2.clear();
scanf("%d %d", &numElem, &lineX);
for(int i = 0; i < numElem; i++)
{
scanf("%d", &tmpNum);
if(tmpNum < lineX)
{
// Po-malkite ot X otivat v edin vektor
v1.push_back(tmpNum);
}
else
{
// Po-golemite ili ravni ot X otivat vyv vtori vektor
v2.push_back(tmpNum);
}
}
mySort(v1);
mySort(v2);
// 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;
}