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

#include <string.h>

#include <iostream>

#include <algorithm>

#include <queue>

#include <vector>

#include <string>

#include <set>

#include <map>

#define ll long long

#define ull unsigned long long

#define rep(i, to) for(int i = 0; i < (to); ++i)

#define rep1(i, to) for(int i = 1; i <= (to); ++i)

#define ms(x, v) memset(x, v, sizeof(x))

using namespace std;

const int N = 200005;

int pa1[N], pa2[N];

int fpa1(int x){ return pa1[x] == x ? x : pa1[x] = fpa1(pa1[x]); }

int fpa2(int x){ return pa2[x] == x ? x : pa2[x] = fpa2(pa2[x]); }

void lnk1(int x, int y) {x = fpa1(x), y = fpa1(y); if(x != y) pa1[x] = y;}

void lnk2(int x, int y) {x = fpa2(x), y = fpa2(y); if(x != y) pa2[x] = y;}

int ans[N];

vector<int> v[N];

int main()

{

#ifdef LOCAL

    freopen("in", "r", stdin);

#endif

//    ios::sync_with_stdio(0);

    int n, k, l, a, b;

    while(scanf("%d%d%d", &n, &k, &l) > 0)

    {

        ms(ans, 0);

        rep1(i, n) pa1[i] = pa2[i] = i, v[i].clear();

        rep1(i, k)

        {

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

            lnk1(a, b);

        }

        rep1(i, l)

        {

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

            lnk2(a, b);

        }

        rep1(i, n) v[fpa1(i)].push_back(i);

        rep1(i, n)

        {

            if(v[i].size())

            {

                map<int, int> mp;

                rep(j, (int)v[i].size()) mp[fpa2(v[i][j])]++;

                rep(j, (int)v[i].size())

                {

                    ans[v[i][j]] = mp[fpa2(v[i][j])];

                }

            }

        }

        rep1(i, n) printf("%d ", ans[i]);

        puts("");

    }

    return 0;

}


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

#include <cstdio>

#include <cstring>

#include <queue>

#include <map>

#include <vector>

#include <algorithm>

#include <cstdlib>

#include <cmath>

#include <bitset>

#define pb push_back

#define mp make_pair

#define x first

#define y second

#define pii pair<int,int>

#define pdd pair<db,db>



using namespace std;



typedef long long ll;

typedef double db;



const int N = 1e5+10,M=1e4+10,MOD = 1e9+7;



int fa[N*2],fb[2*N];

//int ans[N*2];



void init(int n){

    for(int i=0;i<=n;i++)

        fa[i]=fb[i]=i;

}



int finda(int x){

    if(fa[x]!=x)fa[x]=finda(fa[x]);

    return fa[x];

}

int findb(int x){

    if(fb[x]!=x)fb[x]=findb(fb[x]);

    return fb[x];

}



int main()

{

    int n,k,l;

    while(~scanf("%d%d%d",&n,&k,&l)){

        init(n);

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

            int x,y;

            scanf("%d%d",&x,&y);

            int fx=finda(x),fy=finda(y);

            if(fx!=fy)fa[fx]=fy;

        }

        for(int i=0;i<l;i++){

            int x,y;

            scanf("%d%d",&x,&y);

            int fx=findb(x),fy=findb(y);

            if(fx!=fy)fb[fx]=fy;

        }

        map<int,pii> m1;

        map<pii,int> m2;

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

            int xa=finda(i),xb=findb(i);

           //cout<<xa<<" "<<xb<<endl;

            m1[i]=mp(xa,xb);

            m2[mp(xa,xb)]++;

           // cout<<"("<<m1[i].x<<","<<m1[i].y<<") "<<m2[mp(xa,xb)]<<endl<<endl;

        }



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

            cout<<m2[m1[i]]<<" ";

        }

        cout<<endl;

       

    }

}