#include<bits/stdc++.h>
using namespace std;
const int maxn=4e3;
int n,a[maxn],d[maxn];
bool vis[maxn],e[maxn][maxn];
vector <int> to[maxn];
struct cp{
	int id,val;
}ccp;
bool operator <(cp x,cp y){return x.val<y.val;}
priority_queue <cp> q;
int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
void dfs(int now){
	vis[now]=1;
	for(int i=1;i<=n;i++){if(!vis[i]&&e[now][i]){to[now].push_back(i);d[i]++;dfs(i);}}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){scanf("%d",&a[i]);}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(gcd(a[i],a[j])>1) e[i][j]=true;
		}
	}
	for(int i=1;i<=n;i++){
	    if(!vis[i]){
		    dfs(i);
		    ccp.id=i;ccp.val=a[i];
		    q.push(ccp);
		}
	}
	while(!q.empty()){
		cp s=q.top();q.pop();
		printf("%d ",s.val);
		int siz=to[s.id].size(),u;
		for(int i=0;i<siz;i++){
			u=to[s.id][i];
			d[u]--;
			if(d[u]==0){
				ccp.id=u;ccp.val=a[u];
				q.push(ccp);
			}
		}
	}
	printf("\n");
	return 0;
}