#include <bits/stdc++.h>
using namespace std;
const int MX = 300005;
int n, m, s, k, u, v, res[MX];
vector<int> adj[MX];
set<int> st, pos[MX];
void dfs(int u, int p) {
  if (p != -1)
    for (int x : pos[u])
      if (pos[u].count(x)) st.erase(res[x]);
  for (int x : pos[u])
    if (!res[x]) {
      res[x] = *st.begin();
      st.erase(st.begin());
    }
  for (int x : pos[u]) st.insert(res[x]);
  for (int v : adj[u])
    if (v != p) dfs(v, u);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> s;
    while (s--) {
      cin >> k;
      pos[i].insert(k);
    }
  }
  for (int i = 1; i < n; i++) {
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (int i = 1; i <= m; i++) st.insert(i);
  dfs(1, -1);
  for (int i = 1; i <= m; i++) res[i] = max(res[i], 1);
  cout << *max_element(res + 1, res + m + 1) << '\n';
  for (int i = 1; i <= m; i++) cout << res[i] << " ";
  cout << '\n';
  return 0;
}
