#include <bits/stdc++.h>
using namespace std;
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
const long long MAX = 1e5;
const long long mod = 1000000007;
long long pow(long long base, long long exp) {
  base %= mod;
  long long result = 1;
  while (exp > 0) {
    if (exp & 1) result = ((long long)result * base) % mod;
    base = ((long long)base * base) % mod;
    exp >>= 1;
  }
  return result;
}
void solve() {
  long long N;
  cin >> N;
  vector<long long> v(N + 1);
  for (long long i = (0); (1) > 0 ? i < (N) : i >= (N); i += (1)) {
    cin >> v[i];
  }
  if (count(v.begin(), v.end(), v[0]) == N) {
    cout << 1 << endl;
    for (long long i = (0); (1) > 0 ? i < (N) : i >= (N); i += (1)) {
      cout << 1 << " ";
    }
    cout << endl;
    return;
  }
  if (!(N & 1)) {
    cout << 2 << endl;
    for (long long i = (0); (1) > 0 ? i < (N) : i >= (N); i += (1)) {
      cout << i % 2 + 1 << " ";
    }
    cout << endl;
    return;
  }
  for (long long i = (0); (1) > 0 ? i < (N) : i >= (N); i += (1)) {
    if (v[i] == v[(i + 1) % N]) {
      vector<long long> ans(N);
      for (long long j = 0, pos = i + 1; pos < N; ++pos, j ^= 1) {
        ans[pos] = j + 1;
      }
      for (long long j = 0, pos = i; pos >= 0; --pos, j ^= 1) {
        ans[pos] = j + 1;
      }
      cout << 2 << endl;
      for (long long pos = (0); (1) > 0 ? pos < (N) : pos >= (N); pos += (1)) {
        cout << ans[pos] << " ";
      }
      cout << endl;
      return;
    }
  }
  cout << 3 << endl;
  for (long long i = (0); (1) > 0 ? i < (N - 1) : i >= (N - 1); i += (1)) {
    cout << i % 2 + 1 << " ";
  }
  cout << 3 << endl;
  return;
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long tc = 1;
  cin >> tc;
  while (tc--) {
    solve();
  }
  return 0;
}
