#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void MAX(T &x, T y) {
  if (y > x) x = y;
}
template <class T>
inline void MIN(T &x, T y) {
  if (y < x) x = y;
}
template <class T>
inline void rd(T &x) {
  x = 0;
  char o, f = 1;
  while (o = getchar(), o < 48)
    if (o == 45) f = -f;
  do x = (x << 3) + (x << 1) + (o ^ 48);
  while (o = getchar(), o > 47);
  x *= f;
}
const int M = 1e5 + 5;
int cas, n, ans[M], prime[M], divi[M];
vector<int> vi[M];
int main() {
  rd(cas);
  while (cas--) {
    rd(n);
    int top = 0, ptot = 0, dtot = 0, tmp = n;
    for (int i = 2; i * i <= n; i++) {
      if (n % i == 0) {
        divi[++dtot] = i;
        if (i * i != n) divi[++dtot] = n / i;
      }
      if (tmp % i == 0) {
        prime[++ptot] = i;
        while (tmp > 1 && tmp % i == 0) tmp /= i;
      }
    }
    if (tmp > 1) prime[++ptot] = tmp;
    prime[ptot + 1] = prime[1];
    for (int i = 1; i <= ptot; i++) vi[i].clear();
    for (int i = 1; i <= dtot; i++)
      for (int j = 1; j <= ptot; j++)
        if (divi[i] % prime[j] == 0) {
          vi[j].push_back(divi[i]);
          break;
        }
    for (int i = 1; i <= ptot; i++) sort(vi[i].begin(), vi[i].end());
    for (int i = 1; i <= ptot; i++) {
      int sz = vi[i].size();
      for (int j = 0; j < sz; j++)
        if (vi[i][j] % prime[i + 1] == 0) {
          swap(vi[i][j], vi[i][sz - 1]);
          break;
        }
      for (int j = 0; j < sz; j++) ans[++top] = vi[i][j];
    }
    ans[++top] = n;
    for (int i = 1; i <= top; i++)
      printf("%d%c", ans[i], i == top ? '\n' : ' ');
    if (ptot == 2 && prime[1] * prime[2] == n)
      puts("1");
    else
      puts("0");
  }
  return (0 - 0);
}
