#include <bits/stdc++.h>
int32_t gcd(int32_t a, int32_t b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
int32_t mpf(int32_t n, std::vector<int32_t>& primes) {
  for (int32_t i = 0; i < primes.size(); i++)
    if (n % primes[i] == 0) return primes[i];
  return 1;
}
int main() {
  int32_t num_tests;
  std::cin >> num_tests;
  for (int32_t t = 0; t < num_tests; t++) {
    int32_t n;
    std::cin >> n;
    int32_t n2 = n;
    std::vector<int32_t> primes;
    std::map<int32_t, int32_t> powers;
    for (int32_t i = 2; i * i <= n2; i++)
      if (n2 % i == 0) {
        primes.push_back(i);
        while (n2 % i == 0) {
          powers[i]++;
          n2 /= i;
        }
      }
    if (n2 != 1) {
      primes.push_back(n2);
      powers[n2]++;
    }
    std::map<int32_t, std::vector<int32_t> > mpf2;
    for (int32_t i = 1; i * i <= n; i++) {
      if (n % i == 0) {
        mpf2[mpf(i, primes)].push_back(i);
        if (i * i != n) mpf2[mpf(n / i, primes)].push_back(n / i);
      }
    }
    mpf2.erase(1);
    std::vector<int32_t> answer;
    std::unordered_set<int32_t> used;
    for (int32_t i = 0; i < primes.size(); i++) {
      int32_t next =
          primes.size() != 1 ? primes[i] * primes[(i + 1) % primes.size()] : -1;
      for (int32_t j = 0; j < mpf2[primes[i]].size(); j++)
        if (mpf2[primes[i]][j] != next &&
            used.find(mpf2[primes[i]][j]) == used.end()) {
          used.insert(mpf2[primes[i]][j]);
          answer.push_back(mpf2[primes[i]][j]);
        }
      if (primes.size() != 1 && used.find(next) == used.end()) {
        answer.push_back(next);
        used.insert(next);
      }
    }
    for (int32_t j = 0; j < answer.size(); j++) std::cout << answer[j] << " ";
    std::cout << "\n";
    int32_t actions = 0;
    for (int32_t j = 0; j < answer.size(); j++) {
      if (gcd(answer[j], answer[(j + 1) % answer.size()]) == 1) actions++;
    }
    std::cout << actions << "\n";
  }
  return 0;
}
