#include <bits/stdc++.h>
using namespace std;
template <class T>
T sqr(T x) {
  return x * x;
}
template <class T>
T gcd(T a, T b) {
  return (b != 0 ? gcd<T>(b, a % b) : a);
}
template <class T>
T lcm(T a, T b) {
  return (a / gcd<T>(a, b) * b);
}
template <class T>
inline T bigmod(T p, T e, T M) {
  if (e == 0) return 1;
  if (e % 2 == 0) {
    long long int t = bigmod(p, e / 2, M);
    return (T)((t * t) % M);
  }
  return (T)((long long int)bigmod(p, e - 1, M) * (long long int)p) % M;
}
template <class T>
inline T bigexp(T p, T e) {
  if (e == 0) return 1;
  if (e % 2 == 0) {
    long long int t = bigexp(p, e / 2);
    return (T)((t * t));
  }
  return (T)((long long int)bigexp(p, e - 1) * (long long int)p);
}
template <class T>
inline T modinverse(T a, T M) {
  return bigmod(a, M - 2, M);
}
int dx4[] = {1, 0, -1, 0};
int dy4[] = {0, 1, 0, -1};
int dx8[] = {1, 1, 0, -1, -1, -1, 0, 1};
int dy8[] = {0, 1, 1, 1, 0, -1, -1, -1};
int nx8[] = {1, 1, -1, -1, 2, 2, -2, -2};
int ny8[] = {2, -2, 2, -2, 1, -1, 1, -1};
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int n, m, p, sz[300005], mx, col[300005], tmsave[300005], test, all[300005];
vector<int> edges[300005], color[300005];
void dfs(int p, int prev) {
  test++;
  int pres = 1, u;
  for (int i = 0; i < (int)color[p].size(); i++) {
    u = color[p][i];
    if (col[u] > 0) {
      all[col[u]] = test;
    }
  }
  for (int i = 0; i < (int)color[p].size(); i++) {
    u = color[p][i];
    if (col[u] == 0) {
      while (all[pres] == test) pres++;
      col[u] = pres;
      all[pres] = test;
    }
  }
  for (int i = 0; i < (int)edges[p].size(); i++) {
    u = edges[p][i];
    if (u != prev) {
      dfs(u, p);
    }
  }
}
int main() {
  scanf("%d %d", &n, &m);
  mx = 1;
  for (__typeof(n) i = (1); i <= (n); i++) {
    scanf("%d", &sz[i]);
    mx = max(mx, sz[i]);
    for (__typeof(sz[i]) j = (1); j <= (sz[i]); j++) {
      scanf("%d", &p);
      color[i].push_back(p);
    }
  }
  int u, v;
  for (__typeof(n - 1) i = (1); i <= (n - 1); i++) {
    scanf("%d %d", &u, &v);
    edges[u].push_back(v);
    edges[v].push_back(u);
  }
  dfs(1, -1);
  printf("%d\n", mx);
  for (__typeof(m) i = (1); i <= (m); i++) {
    if (col[i] == 0) {
      printf("1 ");
    } else {
      printf("%d ", col[i]);
    }
  }
  return 0;
}
