#include <bits/stdc++.h>
using namespace std;
const int maxn = 300 + 10;
int n, dge[maxn];
bool graph[maxn][maxn], vis[maxn], no_sol;
int son[maxn], ord[maxn][maxn], st[maxn], en[maxn];
void init() {
  scanf("%d", &n);
  for (int i = 1; i < n; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    graph[x][y] = graph[y][x] = true;
    ++dge[x];
    ++dge[y];
  }
  int leaf = 0;
  for (int i = 2; i <= n; ++i)
    if (dge[i] == 1) ++leaf;
  for (int i = 1; i <= leaf; ++i) {
    int x;
    scanf("%d", &x);
    st[x] = en[x] = i;
  }
}
void search(int x) {
  vis[x] = true;
  for (int y = 1; y <= n; ++y)
    if (graph[x][y] && !vis[y]) {
      search(y);
      ++son[x];
      ord[x][son[x]] = y;
    }
  for (int i = 1; i < son[x]; ++i)
    for (int j = i + 1; j <= son[x]; ++j)
      if (st[ord[x][i]] > st[ord[x][j]]) swap(ord[x][i], ord[x][j]);
  for (int i = 1; i < son[x]; ++i)
    if (en[ord[x][i]] + 1 != st[ord[x][i + 1]]) no_sol = true;
  if (son[x] > 0) {
    st[x] = st[ord[x][1]];
    en[x] = en[ord[x][son[x]]];
  }
}
void print(int x) {
  printf("%d ", x);
  for (int i = 1; i <= son[x]; ++i) {
    int y = ord[x][i];
    print(y);
    printf("%d ", x);
  }
}
void solve() {
  search(1);
  if (no_sol)
    printf("-1\n");
  else
    print(1);
}
int main() {
  init();
  solve();
  return 0;
}
