#include<bits/stdc++.h>
using namespace std;
template<int T> struct DSU{
int f[T+5],size;
DSU(){ for(int i=0;i<=T;i++) f[i]=i; }
int get(int x){
if(f[x]==x) return x;
return f[x]=get(f[x]);
}
inline bool same(int x,int y){ return get(x)==get(y); }
inline void merge(int x,int y){
int fx=get(x),fy=get(y);
if(fx==fy) return;
if(fx<fy) swap(fx,fy);
f[fx]=fy;
return;
}
inline void clear(){ for(int i=0;i<=T;i++) f[i]=i; }
};
int d[200010][2],n,m,siz,cnt,o[200020][2],ans[200020],x[200200],y[200020];
bool mp[200020][2];
vector<int> p[200002],id[200020];
DSU<200020> f;
inline void add(int x,int y,int i){
p[x].push_back(y);
p[y].push_back(x);
id[x].push_back(i);
id[y].push_back(i);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d%d",&d[i][0],&d[i][1]);
}
for(int i=1;i<=m;i++){
scanf("%d%d",&x[i],&y[i]); y[i]--;
mp[x[i]][y[i]]=1;
}
for(int i=1;i<=n;i++){
if(d[i][0]>0&&!mp[i][0]) add(i,d[i][0],++cnt),o[i][0]=cnt,f.merge(i,d[i][0]);
if(d[i][1]>0&&!mp[i][1]) add(i,d[i][1],++cnt),o[i][1]=cnt,f.merge(i,d[i][1]);
}
for(int i=1;i<=n;i++) if(f.get(i)==1) ans[i]=-1; else ans[i]=0;
for(int i=m;i>=1;i--){
if(d[x[i]][y[i]]>0){
f.merge(d[x[i]][y[i]],x[i]);
add(d[x[i]][y[i]],x[i],++cnt);
if(f.get(x[i])==1)
if(ans[x[i]]==0){
ans[x[i]]=i-1;
int u=x[i];
for(int j=0;j<p[u].size();j++){
if(ans[p[u][j]]==0)
ans[p[u][j]]=i-1;
}
}
if(f.get(d[x[i]][y[i]])==1)
if(ans[d[x[i]][y[i]]]==0){
ans[d[x[i]][y[i]]]=i-1;
int u=d[x[i]][y[i]];
for(int j=0;j<p[u].size();j++){
if(ans[p[u][j]]==0)
ans[p[u][j]]=i-1;
}
}
}
}
ans[1]=-1;
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
return 0;
}