#include<bits/stdc++.h>
using namespace std;
const int N=2005;
typedef long long ll;
int n,a[N];
int gcd(int x,int y){
    if(!y) return x;
    return gcd(y,x%y);
}
int G[N][N];
struct node{
    int u,v,nxt;
}e[N<<1];
int head[N],cnt;
inline void add(int u,int v){
    e[++cnt].u=u;
    e[cnt].v=v;
    e[cnt].nxt=head[u];
    head[u]=cnt;
}
bool vis[N];
int rudu[N];
inline void dfs(int u){
    vis[u]=1;
    for(int v=1;v<=n;v++)
        if(G[u][v]&&!vis[v]){
            add(u,v);
            rudu[v]++;
            dfs(v);
        }
}
int ans[N];
typedef pair<int,int>pi;
priority_queue<pi>q;
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=i+1;j<=n;j++)
            if(gcd(a[i],a[j])>1) G[i][j]=G[j][i]=1;
    for(int i=1;i<=n;i++)
        if(!vis[i]) dfs(i);
    int cnt=0;
    for(int i=1;i<=n;i++)
        if(!rudu[i]) q.push(pi(a[i],i));
    while(!q.empty()){
        int w=q.top().first,u=q.top().second;
        q.pop();
        ans[++cnt]=w;
        for(int i=head[u];i;i=e[i].nxt){
            int v=e[i].v;
            rudu[v]--;
            if(!rudu[v]) q.push(pi(a[v],v));
        }
    }
    for(int i=1;i<n;i++) printf("%d ",ans[i]);
    printf("%d\n",ans[n]);
    return 0;
}