// Slower C++ solution:
//#include <bits/stdc++.h>

#include <stdio.h>

#include <iostream>

#include <string.h>

#include <math.h>

#include <stdlib.h>

#include <limits.h>

#include <algorithm>

#include <queue>

#include <vector>

#include <set>

#include <map>

#include <stack>

#include <bitset>

#include <string>

#include <time.h>

using namespace std;

long double esp=1e-11;

//#pragma comment(linker, "/STACK:1024000000,1024000000")

#define fi first

#define se second

#define all(a) (a).begin(),(a).end()

#define cle(a) while(!a.empty())a.pop()

#define mem(p,c) memset(p,c,sizeof(p))

#define mp(A, B) make_pair(A, B)

#define pb push_back

#define lson l , m , rt << 1

#define rson m + 1 , r , rt << 1 | 1

typedef long long int LL;

const long double PI = acos((long double)-1);

const LL INF=0x3f3f3f3f3f3f3f3fll;

const int MOD =1000000007ll;

const int maxn=210100;

int ro1[maxn];

int up1(int u){return(ro1[u]==u)?u:ro1[u]=up1(ro1[u]);}

int ro2[maxn];

int up2(int u){return(ro2[u]==u)?u:ro2[u]=up2(ro2[u]);}

vector<pair<int,int> >node[maxn];

int c[maxn][2];

int ans[maxn];

int main()

{

    //freopen("in9.txt", "r", stdin);

    //freopen("in9.txt", "r", stdin);

    //freopen("out9.txt", "w", stdout);

    //::iterator iter;                  %I64d

    //for(int x=1;x<=n;x++)

    //for(int y=1;y<=n;y++)

    //scanf("%d",&a);

    //printf("%d\n",ans);

    int n,k,l;

    scanf("%d%d%d",&n,&k,&l);

    for(int x=1;x<=n;x++)ro1[x]=ro2[x]=x,node[x].clear();

    for(int x=1;x<=k;x++)

    {

        int u,v;

        scanf("%d%d",&u,&v);

        ro1[up1(u)]=up1(v);

    }

    for(int x=1;x<=n;x++)

        node[up1(x)].pb(mp(x,0));

    for(int x=1;x<=l;x++)

    {

        int u,v;

        scanf("%d%d",&u,&v);

        ro2[up2(u)]=up2(v);

    }

    mem(ans,0);

    mem(c,0);

    for(int x=1;x<=n;x++)

    {

    	for(int y=0;y<node[x].size();y++)

		{

			node[x][y].se=up2(node[x][y].fi);

			if(c[node[x][y].se][1]!=x)

			{

				c[node[x][y].se][1]=x;

				c[node[x][y].se][0]=0;

			}

			c[node[x][y].se][0]++;

		}

		for(int y=0;y<node[x].size();y++)

			ans[node[x][y].fi]=c[node[x][y].se][0];

    }

    for(int x=1;x<=n;x++)

        printf("%d%c",ans[x]," \n"[x==n]);

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 9.650976511497626x):
#include<cstdio>

#include<queue>

#include<climits>

#include<algorithm>

#include<cstdlib>

#include<cmath>

#include<cstring>

#include<string>

#include<ctype.h>

#include<set>

#include<vector>

#include<map>

#include<time.h>

#include<list>

#include<stack>

#include<iostream>

using namespace std;

#define mod 1000000007

#define mem(x,k ) memset(x, (k) ,sizeof(x))

#define mp(A, B) make_pair(A, B)

#define pb push_back

#define sca scanf

#define pri printf

#define fi first

#define se second



typedef long long LL;

typedef long double LD;

typedef pair< int , int  > pii;



const LL INFLL=0x3f3f3f3f3f3f3f3fll;

const int INF=0x7fffffff;

const double PI=acos(-1.0);

const double  eps=1e-9;

//freopen("D.in","r",stdin);

//freopen("D.out","w",stdout);

int n,m,k;

int f[200005];

int f2[200005];

map<pair<int ,int >,int> G;

int Father(int k)

{

    if (k==f[k]) return k;

	return f[k]=Father(f[k]);

}



void Union(int x,int y)

{

    if (Father(x)==Father(y)) return;

    else

    {

        f[ f[x] ]=f[y];

        return;

    }

}

int Father2(int k)

{

    if (k==f2[k]) return k;

	return f2[k]=Father2(f2[k]);

}



void Union2(int x,int y)

{

    if (Father2(x)==Father2(y)) return;

    else

    {

        f2[ f2[x] ]=f2[y];

        return;

    }

}

int main(){

    scanf("%d%d%d",&n,&k,&m);

    for (int i=1;i<=n;i++){

        f[i]=f2[i]=i;

    }

    for (int i=1;i<=k;i++){

        int u,v;

        scanf("%d%d",&u,&v);

        Union2(u,v);

    }

    for (int i=1;i<=m;i++){

        int u,v;

        scanf("%d%d",&u,&v);

        Union(u,v);

    }

    for (int i=1;i<=n;i++){

        G[make_pair(Father(i),Father2(i))]++;

    }

    for (int i=1;i<=n;i++){

        //printf("@%d@",Father(i));

        printf("%d",G[make_pair(Father(i),Father2(i))]);

        if (i!=n) printf(" ");

    }

    printf("\n");

    return 0;

}