#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 100;
void cmax(int &x, int y) { x = x < y ? y : x; }
void cmin(int &x, int y) { x = x > y ? y : x; }
int n, m, K, ts, f[N], col[N], vis[N], rev[N], dep[N], fa[N], sz[N], bel[N],
    son[N], dsu[N];
vector<int> nxt[N], G[N], pot[N];
int getfa(int x) { return x == dsu[x] ? x : dsu[x] = getfa(dsu[x]); }
void dfs1(int u, int lst) {
  sz[u] = 1;
  dep[u] = dep[lst] + 1, fa[u] = lst;
  for (auto v : nxt[u])
    if (v != fa[u]) {
      dfs1(v, u);
      sz[u] += sz[v];
      son[u] = sz[son[u]] > sz[v] ? son[u] : v;
    }
}
void dfs2(int u, int lst) {
  bel[u] = son[fa[u]] == u ? bel[fa[u]] : u;
  for (auto v : nxt[u])
    if (v != fa[u]) dfs2(v, u);
}
int LCA(int x, int y) {
  while (bel[x] != bel[y]) {
    dep[bel[x]] > dep[bel[y]] ? x = fa[bel[x]] : y = fa[bel[y]];
  }
  return dep[x] < dep[y] ? x : y;
}
int pa[N], w[N];
vector<pair<int, int> > vec;
void getpa(int x) {
  if (x == pa[x]) return;
  getpa(pa[x]);
  w[x] ^= w[pa[x]], pa[x] = pa[pa[x]];
}
void down(int u) {
  for (auto v : nxt[u])
    if (v != fa[u]) rev[v] ^= rev[u], down(v);
}
bool dp(int u) {
  pair<int, int> A = pair<int, int>(1, K), B = pair<int, int>(1, K);
  int turn = 0;
  rev[u] = 0;
  for (auto v : nxt[u])
    if (v != fa[u])
      if (!dp(v)) return 0;
  vec.clear();
  for (auto v : nxt[u])
    if (v != fa[u]) {
      if (getfa(u) == getfa(v)) cmax(A.first, f[v] + 1);
      pot[pa[v]].push_back(v), vis[pa[v]] = 0;
    }
  int flg = 0;
  for (auto x : pot[pa[u]])
    if (getfa(u) == getfa(x)) flg = w[x];
  for (auto x : pot[pa[u]])
    if (w[x] == flg)
      cmax(A.first, f[x] + 1);
    else
      cmin(A.second, K - f[x]), rev[x] ^= 1;
  for (auto v : nxt[u])
    if (v != fa[u] && vis[pa[v]] != u && pa[v] != pa[u]) {
      vis[pa[v]] = u;
      pair<int, int> now = pair<int, int>(1, K);
      for (auto x : pot[pa[v]])
        if (w[x] == 1)
          cmax(now.first, f[x] + 1);
        else
          cmin(now.second, K - f[x]);
      if (now.first + now.second > K + 1)
        swap(now.first, now.second), now.first = K + 1 - now.first,
                                     now.second = K + 1 - now.second;
      vec.push_back(now);
    }
  for (auto p : vec)
    if (p.first > A.second || p.second < A.first) turn = 1;
  B = A;
  for (auto v : nxt[u])
    if (v != fa[u]) vis[pa[v]] = 0;
  for (auto v : nxt[u])
    if (v != fa[u] && vis[pa[v]] != u && pa[v] != pa[u]) {
      vis[pa[v]] = u;
      pair<int, int> now = pair<int, int>(1, K);
      for (auto x : pot[pa[v]])
        if (w[x] == 1)
          cmax(now.first, f[x] + 1);
        else
          cmin(now.second, K - f[x]), rev[x] ^= 1;
      if (turn ^ (now.first + now.second > K + 1)) {
        swap(now.first, now.second), now.first = K + 1 - now.first,
                                     now.second = K + 1 - now.second;
        for (auto x : pot[pa[v]]) rev[x] ^= 1;
      }
      cmax(B.first, now.first), cmin(B.second, now.second);
    }
  f[u] = B.first;
  for (auto v : nxt[u])
    if (v != fa[u]) pot[pa[v]].clear();
  return B.first <= B.second;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    nxt[u].push_back(v);
    nxt[v].push_back(u);
  }
  dfs1(1, 0);
  dfs2(1, 0);
  static int A[N], B[N];
  for (int i = 1; i <= n; ++i) dsu[i] = i;
  for (int i = 1; i <= m; ++i) {
    int x, y, z;
    scanf("%d%d", &x, &y);
    A[i] = x, B[i] = y;
    z = LCA(x, y);
    if (z == x || z == y) A[i] = B[i] = 0;
    x = getfa(x);
    while (fa[x] != z && dep[x] > dep[z])
      dsu[x] = getfa(fa[x]), x = getfa(fa[x]);
    y = getfa(y);
    while (fa[y] != z && dep[y] > dep[z])
      dsu[y] = getfa(fa[y]), y = getfa(fa[y]);
  }
  for (int i = 1; i <= n; ++i) pa[i] = getfa(i);
  for (int i = 1; i <= m; ++i)
    if (A[i] && B[i]) {
      getpa(A[i]);
      getpa(B[i]);
      if (pa[A[i]] == pa[B[i]]) {
        if (w[A[i]] == w[B[i]]) puts("-1"), exit(0);
      } else {
        if (dep[pa[A[i]]] < dep[pa[B[i]]]) swap(A[i], B[i]);
        w[pa[A[i]]] ^= (w[A[i]] == w[B[i]]), pa[pa[A[i]]] = pa[B[i]];
      }
    }
  for (int i = 1; i <= n; ++i) getpa(i);
  int L = 0, R = n;
  while (L < R - 1) {
    int mid = K = (L + R) >> 1;
    dp(1) ? R = mid : L = mid;
  }
  cout << (K = R) << endl;
  dp(1);
  down(1);
  for (int i = 1; i <= n; ++i)
    f[i] = rev[i] ? (K + 1 - f[i]) : f[i], printf("%d ", f[i]);
  puts("");
  return 0;
}
