#include <bits/stdc++.h>
using namespace std;
const int MAX = 3e5 + 5;
int n, m;
int cnt, c[MAX];
vector<int> T[MAX], E[MAX];
map<int, int> q;
void dfs(int now, int fa) {
  int i, col;
  q.clear();
  col = 1;
  for (i = 0; i < E[now].size(); i++) {
    if (c[E[now][i]]) {
      q[c[E[now][i]]] = 1;
      continue;
    }
  }
  for (i = 0; i < E[now].size(); i++) {
    if (c[E[now][i]]) continue;
    while (q[col]) col++;
    c[E[now][i]] = col++;
  }
  cnt = max(cnt, col - 1);
  for (i = 0; i < T[now].size(); i++)
    if (T[now][i] != fa) dfs(T[now][i], now);
}
int main() {
  int i, j;
  int s, k, u, v;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) {
    scanf("%d", &s);
    while (s--) {
      scanf("%d", &k);
      E[i].push_back(k);
    }
  }
  for (i = 0; i < n - 1; i++) {
    scanf("%d%d", &u, &v);
    T[u].push_back(v);
    T[v].push_back(u);
  }
  dfs(1, 0);
  printf("%d\n", cnt ? cnt : 1);
  for (i = 1; i <= m; i++) printf("%d%c", c[i] ? c[i] : 1, i == m ? '\n' : ' ');
  return 0;
}
