#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const int maxn = 200000 + 1000;
const int maxm = 300000 + 100;
const int inf = 0x3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3;
template <class T>
inline bool scan(T &ret) {
  ret = 0;
  char c;
  int sgn;
  T bit = 0.1;
  if (c = getchar(), c == EOF) return 0;
  while (c != '-' && c != '.' && (c < '0' || c > '9')) c = getchar();
  sgn = (c == '-') ? -1 : 1;
  ret = (c == '-') ? 0 : (c - '0');
  while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
  if (c == ' ' || c == '\n') {
    ret *= sgn;
    return 1;
  }
  while (c = getchar(), c >= '0' && c <= '9') ret += (c - '0') * bit, bit /= 10;
  ret *= sgn;
  return 1;
}
template <class T, class... Args>
inline void scan(T &x, Args &...args) {
  scan(x), scan(args...);
}
int kase = 0;
template <class T>
T exgcd(T a, T b, T &x, T &y) {
  if (b == 0) {
    x = 1, y = 0;
    return a;
  }
  T res = exgcd(b, a % b, y, x);
  y -= a / b * x;
  return res;
}
template <class T>
T gcd(T a, T b) {
  return b == 0 ? a : gcd(b, a % b);
}
template <class T>
T qpow(T a, T n, T mod) {
  T res = 1;
  while (n) {
    if (n & 1) {
      res = res * a % mod;
    }
    a = a * a % mod, n >>= 1;
  }
  return res;
}
void init() {}
int a[maxn], b[maxn];
void solve() {
  int n;
  scan(n);
  int time = 1;
  bool sma = true;
  for (int i = 0; i < n; i++) {
    scan(a[i]);
    if (a[i] != a[i - 1] && i != 0 && sma) sma = false;
  }
  if (sma) {
    cout << 1 << endl;
    for (int i = 0; i < n; i++) cout << '1' << " ";
    cout << endl;
    return;
  }
  if (n % 2 == 0) {
    cout << 2 << endl;
    for (int i = 0; i < n; i++) {
      if (i % 2) {
        cout << 1 << " ";
      } else
        cout << 2 << " ";
    }
    cout << endl;
    return;
  }
  int pre = 0;
  b[0] = time++;
  for (int i = 1; i < n - 1; i++) {
    if (a[i] == a[i - 1])
      b[i] = b[i - 1] % 2 + 1, pre++;
    else {
      b[i] = b[i - 1] % 2 + 1;
    }
  }
  if (a[n - 1] == a[0])
    b[n - 1] = b[n - 2] % 2 + 1;
  else if (a[n - 1] == a[n - 2])
    b[n - 1] = b[0] % 2 + 1;
  else {
    if (b[n - 2] == b[0])
      b[n - 1] = b[n - 2] % 2 + 1;
    else if (pre) {
      bool flag = false;
      cout << time << endl;
      for (int i = 0; i < n - 1; i++) {
        if (flag) {
          cout << b[i] % 2 + 1 << " ";
        } else {
          if (i != 0 && a[i - 1] == a[i] && !flag) {
            flag = true;
            cout << b[i] % 2 + 1 << " ";
          } else {
            cout << b[i] << " ";
          }
        }
      }
      cout << b[n - 2] << " " << endl;
      return;
    } else {
      cout << 3 << endl;
      for (int i = 0; i < n - 1; i++) {
        cout << b[i] << " ";
      }
      cout << 3 << endl;
      return;
    }
  }
  cout << time << endl;
  for (int i = 0; i < n; i++) {
    cout << b[i] << " ";
  }
  cout << endl;
}
void solve(int i) {}
int main() {
  int T = 1;
  scan(T);
  while (T--) {
    solve();
  }
}
