//题意:求出i->j既可以通过roads到达又可以通过railways达到的city数量(自己和本身connect)
//先用并查集分好成两组A,B(road,railway),如何快速求出每个i对应的j的数量? ((i,j)在A是联通的&&在B也联通的)
//即如果i两组的祖先为x,y j的祖先也为x,y则i->j在两组都即可通过road也可以通过railway(i->x->j),(i-y->j)
//(i,j)满足条件当且仅当(x,y)相等,用map记录每个i的祖先(xi,yi)的出现次数即可,复杂度为(O(nlogn))
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
const int N=2e5+20;
const int M=30;
struct Union_find{
Union_find(int n){par.resize(n);for(int i=0;i<n;i++) par[i]=i;}
int find(int x){return (par[x]==x)?x:par[x]=find(par[x]);}
void unite(int a,int b){a=find(a),b=find(b);par[a]=b;}
bool same(int a,int b){return find(a)==find(b);}
vector<int> par;
};
int main()
{
int n,k,l;
cin>>n>>k>>l;
Union_find uf1(n);
for(int i=0;i<k;i++)
{
int u,v;
cin>>u>>v;
uf1.unite(u-1,v-1);//vector par[i]从0开始标号
}
Union_find uf2(n);
for(int i=0;i<l;i++)
{
int p,q;
cin>>p>>q;
uf2.unite(p-1,q-1);
}
map<P,int> mp;
for(int i=0;i<n;i++)
{
mp[make_pair(uf1.find(i),uf2.find(i))]++;
}
for(int i=0;i<n;i++)
{
cout<<mp[make_pair(uf1.find(i),uf2.find(i))];
if(i==n-1)
cout<<endl;
else
cout<<' ';
}
return 0;
}