#include<bits/stdc++.h>
#define maxn 2005
using namespace std;
typedef long long LL;
int read()
{
	char c=getchar();int f=1,sum=0;
	while(c<'0' || c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0' && c<='9'){sum=sum*10+c-'0';c=getchar();}
	return sum*f;
}
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
int n,a[maxn];
int head[maxn],to[maxn<<1],nex[maxn<<1],cnt;
bool li[maxn][maxn],vis[maxn];
int deg[maxn];
void add(int u,int v)
{
	deg[v]++;to[++cnt]=v;nex[cnt]=head[u];head[u]=cnt;
}
void dfs(int x)
{
	vis[x]=1;
	for(int i=1;i<=n;i++)
	if(li[x][i] && !vis[i])
	{
		add(x,i);
		dfs(i);
	}
}
struct node{
	int val,id;
    friend bool operator <(node a,node b){
        return a.val<b.val;
    }
};
priority_queue<node> q;
int main()
{
	n=read();
	for(int i=1;i<=n;i++) a[i]=read();
	sort(a+1,a+1+n);
	for(int i=1;i<n;i++)
	for(int j=i+1;j<=n;j++)
	if(gcd(a[i],a[j])>1) li[i][j]=li[j][i]=1;
	for(int i=1;i<=n;i++)
	if(!vis[i])
	dfs(i);
	for(int i=1;i<=n;i++)
	if(!deg[i])
	q.push((node){a[i],i});
	for(int i=1;i<=n;i++)
	{
		node now=q.top();
		q.pop();
		printf("%d ",a[now.id]);
		for(int j=head[now.id];j;j=nex[j])
		{
			deg[to[j]]--;
			if(!deg[to[j]])
			q.push((node){a[to[j]],to[j]});
		}
	}
	return 0;
}
