#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pll pair<ll, ll>
#define pii pair<int, int>
#define fs first
#define sc second
#define pb push_back
const int maxn=3e5;
vector<pii> ad[maxn+1];
vector<int> st;
int pr[maxn+1],pe[maxn+1],sz[maxn+1],hd[maxn+1],od[maxn+1],id[maxn+1],tt,sg[4*maxn],ce[maxn+1],d[maxn+1];
int n,m;
void dfs(int v,int p){
sz[v]=1;
for(auto[u,w]:ad[v])if(u!=p){
pr[u]=v;
pe[u]=w;
ce[w]=u;
d[u]=d[v]+1;
dfs(u,v);
sz[v]+=sz[u];
}
}
void dfs2(int v,int p,int h){
hd[v]=h;
id[v]=tt;
od[tt++]=v;
int x=0;
for(auto[u,w]:ad[v])if(u!=p){
if(sz[u]>sz[x])x=u;
}
if(!x)return;
dfs2(x,v,h);
for(auto[u,w]:ad[v])if(u!=p&&u!=x){
dfs2(u,v,u);
}
}
int bld(int v,int l,int r){
if(l==r)return sg[v]=1;
int m=l+r>>1;
return sg[v]=bld(2*v+1,l,m)+bld(2*v+2,m+1,r);
}
int upd(int v,int l,int r,int i){
if(i<l||i>r)return sg[v];
if(l==r)return --sg[v];
int m=l+r>>1;
return sg[v]=upd(2*v+1,l,m,i)+upd(2*v+2,m+1,r,i);
}
void qry(int v,int l,int r,int l2,int r2){
if(l>r2||r<l2||!sg[v])return;
if(l==r){
st.pb(pe[od[l]]);
}else{
int m=l+r>>1;
qry(2*v+1,l,m,l2,r2);
qry(2*v+2,m+1,r,l2,r2);
}
}
void qry(int u,int v){
while(hd[u]!=hd[v]){
if(d[hd[u]]>d[hd[v]])swap(u,v);
qry(0,0,n-1,id[hd[v]],id[v]);
v=pr[hd[v]];
}
if(u==v)return;
if(d[u]>d[v])swap(u,v);
qry(0,0,n-1,id[u]+1,id[v]);
}
void solve() {
cin>>n>>m;
pii ed[m+1];
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
ed[i]={u,v};
}
bool sp[m+1];
memset(sp,0,sizeof(sp));
for(int i=0;i<n-1;i++){
int x;
cin>>x;
sp[x]=1;
auto[u,v]=ed[x];
ad[u].pb({v,x});
ad[v].pb({u,x});
}
dfs(1,1);
dfs2(1,1,1);
bld(0,0,n-1);
int ans[m+1],t=0;
bool b[m+1];
memset(b,0,sizeof(b));
for(int i=1;i<=m;i++)if(!b[i]){
b[i]=1;
if(ce[i]){
upd(0,0,n-1,id[ce[i]]);
}
if(!sp[i]){
auto[u,v]=ed[i];
st.clear();
qry(u,v);
sort(st.begin(),st.end());
for(int x:st){
b[x]=1;
upd(0,0,n-1,id[ce[x]]);
ans[x]=++t;
}
}
ans[i]=++t;
}
for(int i=1;i<=m;i++)cout<<ans[i]<<' ';
cout<<'\n';
}
int main() {
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
solve();
}