#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans[400005];
struct edge{
int left,right;
bool lf,rf;
}a[400005];
int u[400005];
int v[400005];
int fa[400005];
vector<int> g[400005];
void init(){
for(int i=1;i<=n;i++){
fa[i]=i;
a[i].lf=a[i].rf=0;
}
}
int _find(int x){
if(x<=0){
return 0;
}
if(x==fa[x]){
return x;
}
return fa[x]=_find(fa[x]);
}
int unite(int x,int y){
x=_find(x);
y=_find(y);
if(x!=y&&x!=-1&&y!=-1){
fa[x]=y;
}
}
void dfs(int x,int w){
ans[x]=w;
for(int i=0;i<g[x].size();i++){
if(!ans[g[x][i]]){
dfs(g[x][i],w);
}
}
}
int main(){
cin>>n>>m;
init();
for(int i=1;i<=n;i++){
cin>>a[i].left>>a[i].right;
}
for(int i=1,op;i<=m;i++){
cin>>u[i]>>op;
if(op==1){
a[u[i]].lf=1;
v[i]=a[u[i]].left;
}else{
a[u[i]].rf=1;
v[i]=a[u[i]].right;
}
}
for(int i=1;i<=n;i++){
if(!a[i].lf&&a[i].left!=-1){
g[i].push_back(a[i].left);
g[a[i].left].push_back(i);
unite(i,a[i].left);
}
if(!a[i].rf&&a[i].right!=-1){
g[i].push_back(a[i].right);
g[a[i].right].push_back(i);
unite(i,a[i].right);
}
}
for(int i=1;i<=n;i++){
if(_find(i)==_find(1)){
ans[i]=-1;
}
}
for(int i=m;i>=1;i--){
if(u[i]==-1||v[i]==-1){
continue;
}
unite(u[i],v[i]);
g[u[i]].push_back(v[i]);
g[v[i]].push_back(u[i]);
if(_find(u[i])==_find(1)&&!ans[u[i]]){
dfs(u[i],i-1);
}
if(_find(v[i])==_find(1)&&!ans[v[i]]){
dfs(v[i],i-1);
}
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<endl;
}
return 0;
}