#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1005;
typedef long long ll;
const int inf = 0x3f3f3f3f;
int a[N],res[N];
inline int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
//最大的数一定是放在第一个,然后每次找到这样一个数:和前面所有数的gcd最大,
//找的过程中不需要和前面所有的数都取一次gcd,只需用一个变量记录已经确定数的gcd
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int m = 0;
for (int i = 0; i < n; i++)
{
cin >> a[i];
m = max(m, a[i]);
}
res[0] = m;
int p = m;//已经确定的数的gcd
for (int i = 1; i < n; i++)
{
int flag = 1;
int t = res[i - 1];
int m = 0, r = 0;//m是剩下的数中和p的gcd的最大值,r是取得最大gcd的数
for (int j = 0; j < n; j++)
{
if (a[j] == t && flag)//等于t的数可能不唯一!
{
a[j] = 0;
flag = 0;
}
if (a[j])
{
int k = gcd(p, a[j]);
if (k > m)
{
m = k;
r = a[j];
}
}
}
p = m;
res[i] = r;
}
for (int i = 0; i < n; i++)
cout << res[i] << ' ';
cout << endl;
}
return 0;
}