#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MAXN = 2e5 + 5;

struct Edge
{
	int next,to;
}e[MAXN<<1];
int head[MAXN],etot=0;
inline void add(int u,int v)
{
	e[++etot] = (Edge){ head[u],v};
	head[u] = etot;
}

int n;

int dep[MAXN], mxdep[MAXN];
void dfs_dep(int u,int fa)
{
	mxdep[u] = dep[u];
	for(int i=head[u]; i; i=e[i].next)
	{
		int v = e[i].to;
		if(v == fa) continue;
		dep[v] = dep[u] + 1;
		dfs_dep(v,u);
		mxdep[u] = max(mxdep[u], mxdep[v]);
	}
}

inline int get_far(int u)
{
	dep[u] = 0; dfs_dep(u,0);
	return max_element(dep+1,dep+n+1) - dep;
}

inline bool cmp_mxdep(int x,int y){ return mxdep[x] < mxdep[y];}

int res[MAXN], cur_res = 0;
void dfs_res(int u,int fa)
{
	res[u] = ++cur_res;
	vector<int> g;
	for(int i=head[u]; i; i=e[i].next)
	{
		int v = e[i].to;
		if(v != fa) g.push_back(v);
	}
	sort(g.begin(), g.end(), cmp_mxdep);
	
	for(int i=0; i<(int)g.size(); ++i)
		dfs_res(g[i], u);
	++cur_res;
}

int main(void)
{
	scanf("%d",&n);
	for(int i=1; i<n; ++i)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v); add(v,u);
	}
	
	int rt = get_far(get_far(1));
	dep[rt] = 0;
	dfs_dep(rt, 0);
	dfs_res(rt, 0);
	
	for(int i=1; i<=n; ++i) printf("%d ",res[i]);
	return 0;
}
#include <bits/stdc++.h>
#define F first
#define S second

using namespace std;

const int N=105,M=105*105;

int a[M],b[M],ans[M];
int c[N],vis[N];
vector<int> rem;
vector<pair<int,int> > adj[N];
int can[N][N];
int n,m;

void go(int x,int pa=-1)
{
	if(vis[x]==1) return;
	vis[x]=1;
	for(auto i:adj[x])
	{
		if(i.S==pa) continue;
		if(ans[i.S]==-1)
		{
			ans[i.S]=(a[i.S]!=x);
			go(i.F,i.S);
		}
	}
}

int main()
{
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
		can[i][i]=1;
	for(int i=0;i<m;i++)
	{
		scanf("%d %d",&a[i],&b[i]);
	}
	for(int i=1;i<=n;i++)
		scanf("%d",&c[i]);
	for(int i=0;i<m;i++)
	{
		if(c[a[i]]!=c[b[i]])
		{
			ans[i]=c[a[i]]<c[b[i]];
		}
		else
		{
			rem.push_back(i);
			ans[i]=-1;
		}
	}
	// 0 -> , 1 <-
	for(int i=0;i<rem.size();i++)
	{
		int x=rem[i];
		adj[a[x]].push_back({b[x],x});
		adj[b[x]].push_back({a[x],x});
		vis[a[x]]=-1; vis[b[x]]=-1;
	}
	for(int i=1;i<=n;i++)
	{
		if(vis[i]==-1)
			go(i);
	}
	for(int i=0;i<m;i++)
	{
		if(ans[i])
			puts("<-");
		else
			puts("->");
	}
}