#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 5, inf = 1e18, mod = 998244353;
const double PI = 3.1415926536;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
template <typename T>
ostream& operator<<(ostream& out, const vector<T>& mas) {
  for (const auto& x : mas) {
    out << x << ' ';
  }
  return out;
}
bool is_prime(long long n) {
  for (long long i = 2; i * i <= n; ++i) {
    if (n % i == 0) {
      return false;
    }
  }
  return true;
}
inline long long getPow(long long a, long long b) {
  long long res = 1ll, tp = a;
  while (b) {
    if (b & 1ll) {
      res *= tp;
    }
    tp *= tp;
    tp %= mod;
    res %= mod;
    b >>= 1ll;
  }
  return res;
}
long long vec_mult(const pair<long long, long long>& t1,
                   const pair<long long, long long>& t2,
                   const pair<long long, long long>& t3) {
  const long long &x1 = t1.first, y1 = t1.second;
  const long long &x2 = t2.first, y2 = t2.second;
  const long long &x3 = t3.first, y3 = t3.second;
  return abs((x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1));
}
void ok() { cout << "YES" << '\n'; }
void no() { cout << "NO" << '\n'; }
inline long long nxt() {
  long long x;
  cin >> x;
  return x;
}
template <typename T>
void compress(vector<T>& a) {
  vector<T> buf = a;
  sort((buf).begin(), (buf).end());
  (buf).resize(unique((buf).begin(), (buf).end()) - (buf).begin());
  for (int i = 0; i < a.size(); i++) {
    a[i] = (lower_bound(buf.begin(), buf.end(), a[i]) - buf.begin()) + 1;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int t = nxt();
  while (t--) {
    int n = nxt();
    vector<int> a(n);
    int p[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
    for (int i = 0; i < n; i++) {
      int x = nxt();
      for (int j = 0; j < 11; j++) {
        if (x % p[j] == 0) {
          a[i] = j + 1;
        }
      }
    }
    compress(a);
    cout << *max_element(a.begin(), a.end()) << '\n' << a << '\n';
  }
  return 0;
}
