#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> P;

struct UF {
  vector<int> data;
  UF(int size) : data(size, -1) { }
  bool unite(int x, int y) {
    x = root(x); y = root(y);
    if (x != y) {
      if (data[y] < data[x]) swap(x, y);
      data[x] += data[y]; data[y] = x;
    }
    return x != y;
  }
  bool find(int x, int y) {
    return root(x) == root(y);
  }
  int root(int x) {
    return data[x] < 0 ? x : data[x] = root(data[x]);
  }
  int size(int x) {
    return -data[root(x)];
  }
};

int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);

  int n,k,l;cin>>n>>k>>l;
  UF road(n),rail(n);
  for(int i=0;i<k;i++){
      int p,q;cin>>p>>q;
      p--;q--;
      road.unite(p,q);
  }
  for(int i=0;i<l;i++){
      int r,s;cin>>r>>s;
      r--;s--;
      rail.unite(r,s);
  }
  map<P,int> mp;
  for(int i=0;i<n;i++){
      mp[P(road.root(i),rail.root(i))]++;
  }
  for(int i=0;i<n;i++){
      cout<<mp[P(road.root(i),rail.root(i))];
      if(i!=n-1)cout<<" ";
      else cout<<endl;
  }
}
