import java.io.{BufferedReader, IOException, InputStream, InputStreamReader}
import java.util.StringTokenizer

import scala.collection.mutable
import scala.util.Sorting
import math.{abs, max, min}
import scala.collection.mutable.ArrayBuffer

object Main {
  def solve(): Unit = {
    val sc = new InputReader(System.in)
    val N = sc.nextInt()
    val K = sc.nextInt()
    val L = sc.nextInt()

    var i = 0
    val uf_road = new UnionFind(N + 1)
    i = 0
    while (i < K) {
//    (0 until K) foreach { _ =>
      uf_road.unite(sc.nextInt(), sc.nextInt())
      i += 1
    }

    val uf_rail = new UnionFind(N + 1)
    i = 0
    while (i < L) {
//    (0 until L) foreach { _ =>
      uf_rail.unite(sc.nextInt(), sc.nextInt())
      i += 1
    }

    val group = new java.util.HashMap[(Int, Int), Int](N) // key => group
    i = 1
    while (i <= N) {
//    (1 to N) foreach { i =>
      val k = (uf_road.find(i), uf_rail.find(i))
      group.put(k, i)
      i += 1
    }
    val i2g = Array.ofDim[Int](N + 1) // i => group
    i = 1
    while (i <= N) {
//    (1 to N) foreach { i =>
      val k = (uf_road.find(i), uf_rail.find(i))
      i2g(i) = group.get(k)
      i += 1
    }
    val count = Array.ofDim[Int](N + 1) // group => count
    i = 1
    while (i <= N) {
//    (1 to N) foreach { i =>
      count(i2g(i)) += 1
      i += 1
    }
    i = 1
    while (i <= N) {
//    (1 to N) foreach { i =>
      if (i > 1) print(" ")
      print(count(i2g(i)))
      i += 1
    }

//    val count = mutable.Map[(Int, Int), Int]()
//    var i = 1
//    while(i <= N) {
//      val k = key(i)
//      if (!(count contains k)) count(k) = 0
//      count(k) = count(k) + 1
//      i += 1
//    }
//
//    i = 1
//    while(i <= N) {
//      if (i > 1) print(" ")
//      print(count(key(i)))
//      i += 1
//    }
//    println()
//    val count = ((1 to N) map key).groupBy(identity).mapValues(_.size)
//    val ans = ((1 to N) map (key _).andThen (count(_))).mkString(" ")
//    println(ans)
  }

  def main(args: Array[String]): Unit = {
    solve()
  }



  class InputReader(val stream: InputStream) {
    val reader = new BufferedReader(new InputStreamReader(stream), 32768)
    var tokenizer: StringTokenizer = null

    def next: String = {
      while (tokenizer == null || !tokenizer.hasMoreTokens)
        tokenizer = new StringTokenizer(reader.readLine)
      tokenizer.nextToken
    }

    def nextInt(): Int = next.toInt
    def nextLong(): Long = next.toLong
    def nextChar(): Char = next.charAt(0)
  }

  class UnionFind(n: Int) {
    private val par = Array.ofDim[Int](n)
    (0 until n) foreach (i => par(i) = i)
    private val rank = Array.ofDim[Int](n)

    def find(x: Int): Int = {
      if (par(x) == x) x
      else {
        par(x) = find(par(x))
        par(x)
      }
    }

    def unite(x: Int, y: Int): Unit = {
      val x1 = find(x)
      val y1 = find(y)
      if (x1 != y1) {
        if (rank(x1) < rank(y)) {
          par(x1) = y1
        } else {
          par(y1) = x1
          if (rank(x1) == rank(y1)) rank(x1) += 1
        }
      }
    }
  }
}
