#include <bits/stdc++.h>
using namespace std;
bool deb_mode = 0;
class debugger {
  vector<string> vars;

 public:
  template <typename T>
  debugger &operator,(const T v) {
    stringstream ss;
    ss << v, vars.push_back(ss.str());
    return *this;
  }
  void printall() {
    int j = 0, l = vars.size();
    for (int i = 0; i < (l - 1); i++) {
      if (i) cout << ", ";
      for (; j < vars[l - 1].size(); j++) {
        if (vars[l - 1][j] == ',') {
          j++;
          break;
        }
        cout << vars[l - 1][j];
      }
      cout << " = " << vars[i];
    }
    vars.clear();
  }
} Dbug;
template <typename T1, typename T2>
inline ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << "(" << p.first << "," << p.second << ")";
}
template <typename T>
inline ostream &operator<<(ostream &os, const vector<T> &v) {
  bool first = true;
  os << "{";
  for (unsigned int i = 0; i < v.size(); i++) {
    if (!first) os << ",";
    os << v[i];
    first = false;
  }
  return os << "}";
}
template <typename T>
inline ostream &operator<<(ostream &os, const set<T> &v) {
  bool first = true;
  os << "{";
  for (typename set<T>::const_iterator ii = v.begin(); ii != v.end(); ++ii) {
    if (!first) os << ",";
    os << *ii;
    first = false;
  }
  return os << "}";
}
template <typename T1, typename T2>
inline ostream &operator<<(ostream &os, const map<T1, T2> &v) {
  bool first = true;
  os << "{";
  for (typename map<T1, T2>::const_iterator ii = v.begin(); ii != v.end();
       ++ii) {
    if (!first) os << ",";
    os << *ii;
    first = false;
  }
  return os << "}";
}
template <typename T>
void getarray(T a[], int b, int e) {
  for (int i = b; i < e + b; i++) cin >> a[i];
}
template <typename T>
void printarray(T a[], int b, int e) {
  for (int i = b; i < e - 1 + b; i++) cout << a[i] << " ";
  if (e - 1 + b >= 0) cout << a[e - 1 + b] << '\n';
}
template <typename T>
void printV(vector<T> v) {
  int sz = v.size();
  if (sz) cout << v[0];
  for (int i = 1; i < sz; i++) cout << " " << v[i];
  printf("\n");
}
template <typename T>
T gcd(T a, T b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
template <typename T>
T BigMod(T b, T p, T m) {
  if (p == 0) return 1;
  if (p % 2 == 0) {
    T s = BigMod(b, p / 2, m);
    return ((s % m) * (s % m)) % m;
  }
  return ((b % m) * (BigMod(b, p - 1, m) % m)) % m;
}
template <typename T>
T ModInv(T b, T m) {
  return BigMod(b, m - 2, m);
}
pair<long long int, pair<long long int, long long int> > ext_gcd(
    long long int a, long long int b) {
  if (b == 0) return make_pair(a, make_pair(1LL, 0LL));
  pair<long long int, pair<long long int, long long int> > t =
      ext_gcd(b, a % b);
  return make_pair(
      t.first,
      make_pair(t.second.second, t.second.first - a / b * t.second.second));
}
long long int ModInvNonPrimeM(long long int N, long long int M) {
  pair<long long int, pair<long long int, long long int> > r = ext_gcd(N, M);
  r.second.first %= M;
  if (r.second.first < 0) r.second.first += M;
  return r.second.first;
}
template <class T>
inline void read(T &x) {
  bool Minus = 0;
  char c;
  for (c = getchar(); c <= 32; c = getchar())
    ;
  if (c == '-') Minus = 1, c = getchar();
  for (x = 0; c > 32; c = getchar()) x = x * 10 + c - '0';
  if (Minus) x = -x;
}
char getc() {
  char c;
  for (c = getchar(); c <= 32; c = getchar())
    ;
  return c;
}
int CI(int &_x) { return scanf("%d", &_x); }
int CI(int &_x, int &_y) { return scanf("%d %d", &_x, &_y); }
int CI(int &_x, int &_y, int &_z) { return scanf("%d %d %d", &_x, &_y, &_z); }
int CI(int &_a, int &_b, int &_c, int &_d) {
  return scanf("%d %d %d %d", &_a, &_b, &_c, &_d);
}
template <class T1, class T2>
inline T1 UMAX(T1 &m, T2 other) {
  if (m < other) m = other;
  return m;
}
template <class T1, class T2>
inline T1 UMIN(T1 &m, T2 other) {
  if (m > other) m = other;
  return m;
}
template <class T>
string toString(T n) {
  ostringstream oss;
  oss << n;
  return oss.str();
}
int toInt(string s) {
  int r = 0;
  istringstream sin(s);
  sin >> r;
  return r;
}
long long int toLong(string s) {
  long long int r = 0;
  istringstream sin(s);
  sin >> r;
  return r;
}
bool isVowel(char ch) {
  ch = tolower(ch);
  if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
    return true;
  return false;
}
bool isUpper(char c) { return c >= 'A' && c <= 'Z'; }
bool isLower(char c) { return c >= 'a' && c <= 'z'; }
int dr8[8] = {+1, -1, +0, +0, +1, -1, -1, +1};
int dc8[8] = {+0, +0, -1, +1, +1, +1, -1, -1};
int dr4[4] = {+0, +0, +1, -1};
int dc4[4] = {-1, +1, +0, +0};
int kn8r[8] = {+1, +2, +2, +1, -1, -2, -2, -1};
int kn8c[8] = {+2, +1, -1, -2, -2, -1, +1, +2};
const double EPS = 1e-9;
const int INF = (1 << 30) - 1;
const long long int LINF = (1ll << 62) - 1;
const int mod = (int)1e9 + 7;
const int MAX = (int)1e5;
int C[MAX + 7];
vector<int> G[MAX + 7];
bool dfs(int u, int col, int par) {
  if (C[u] != col) return false;
  bool ret = true;
  for (int i = 0; i < G[u].size(); i++) {
    if (G[u][i] != par) ret = ret && dfs(G[u][i], col, u);
  }
  return ret;
}
int main() {
  if (deb_mode) srand(int(time(NULL)));
  int i, j, k, l, n, m, q, a, b, c;
  pair<int, int> edges[MAX + 7];
  cin >> n;
  for (i = 0; i < n - 1; i++) {
    cin >> a >> b;
    edges[i] = make_pair(a, b);
    G[a].push_back(b);
    G[b].push_back(a);
  }
  for (i = 1; i <= n; i++) CI(C[i]);
  bool yes = false, sameColor = true;
  int root;
  for (i = 0; i < n - 1; i++) {
    if (C[edges[i].first] != C[edges[i].second]) {
      sameColor = false;
      root = edges[i].first;
      bool allOK = true;
      for (j = 0; j < G[root].size(); j++) {
        bool ret = dfs(G[root][j], C[G[root][j]], root);
        allOK = allOK && ret;
      }
      if (allOK) {
        yes = true;
        break;
      }
      root = edges[i].second;
      allOK = true;
      for (j = 0; j < G[root].size(); j++) {
        bool ret = dfs(G[root][j], C[G[root][j]], root);
        allOK = allOK && ret;
      }
      if (allOK) {
        yes = true;
        break;
      } else
        break;
    }
  }
  if (sameColor) {
    cout << "YES\n2\n";
  } else if (yes) {
    cout << "YES\n" << root << "\n";
  } else {
    cout << "NO\n";
  }
  if (deb_mode)
    cerr << "EXECUTION TIME = " << (1.0 * clock()) / CLOCKS_PER_SEC
         << " SECONDS\n";
  return 0;
}
