#include <iostream>

int main() {
    std::cout << "Hello World!";
    return 0;
}
class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!"); 
    }
}
print('Hello world!')
#include<algorithm>
#include<cstring>
#include<vector>

using namespace std;

const int N=200001;

int p[N],nums[N];

int x=0;


int find(int x)
{
	int r=x,head=x;//父节点
	while(p[r]!=r){
		head=r;
		r=p[r];//找到他的前导结点
	}
	int i=x,j;
	while(i!=r)//路径压缩算法
	{
		j=p[i];//记录x的前导结点
		if(nums[i]==-1&&nums[head]!=-1){
			nums[i]=nums[head];
		}
		p[i]=r;//将i的前导结点设置为r根节点
		i=j;
	}
	return r;
}

void init(){
	memset(nums,-1,sizeof(nums));
}

int main(){
	init();
	int n,m1,m2;
	cin>>n>>m1>>m2;
	for(int i=0;i<=n;i++) p[i]=i;
	nums[1]=0;
	while(m1--){
		int a,b;
		scanf("%d %d",&a,&b);
		if(find(a)==1||find(b)==1){
			p[find(a)]=1;
			p[find(b)]=1;
			nums[a]=nums[b]=0;
		}
		else{
			p[find(a)]=find(b);
		}
	}
	while(m2--){
		x++;
		int a,b;
		scanf("%d %d",&a,&b);
		if(find(b)==1||find(a)==1){
			if(find(a)==1&&find(b)==1){
				continue;
			}
			else{
				if(find(a)==1){
					nums[find(b)]=x;
					p[find(b)]=1;
				}
				else{
					nums[find(a)]=x;
					p[find(a)]=1;
				}
			}
		}
		else{
			p[find(a)]=find(b);
		}
	}
	for(int i=1;i<=n;i++){
		find(i);
	}
	cout<<endl;
	for(int i=1;i<=n;i++) cout<<nums[i]<<endl;
}