using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

public class Program
{
    static int N, K, L;
    static int[] p, q, r, s;

    public static void Main(string[] args)
    {
        N = Input.NextInt();
        K = Input.NextInt();
        L = Input.NextInt();

        p = new int[K];
        q = new int[K];
        for (int i = 0; i < K; i++)
        {
            var pq = Input.LineInt();
            p[i] = pq[0] - 1;
            q[i] = pq[1] - 1;
        }
        r = new int[L];
        s = new int[L];
        for (int i = 0; i < L; i++)
        {
            var pq = Input.LineInt();
            r[i] = pq[0] - 1;
            s[i] = pq[1] - 1;
        }

        var nodes1 = new UnionFind<int>[N];
        for (int i = 0; i < N; i++)
        {
            nodes1[i] = new UnionFind<int>(i);
        }
        for (int i = 0; i < K; i++)
        {
            UnionFind<int>.Unite(nodes1[p[i]], nodes1[q[i]]);
        }

        var nodes2 = new UnionFind<int>[N];
        for (int i = 0; i < N; i++)
        {
            nodes2[i] = new UnionFind<int>(i);
        }
        for (int i = 0; i < L; i++)
        {
            UnionFind<int>.Unite(nodes2[r[i]], nodes2[s[i]]);
        }

        var info = new Tuple<UnionFind<int>, UnionFind<int>>[N];
        var ans = new int[N];
        var xinfo = new Dictionary<Tuple<UnionFind<int>, UnionFind<int>>, int>();
        for (int i = 0; i < N; i++)
        {
            var key = info[i] = new Tuple<UnionFind<int>, UnionFind<int>>(nodes1[i].Root(), nodes2[i].Root());
            if (!xinfo.ContainsKey(key))
                xinfo[key] = 0;
            xinfo[key]++;
        }
        for (int i = 0; i < N; i++)
        {
            var key = info[i];
            ans[i] = xinfo[key];
        }
        Console.WriteLine(string.Join(" ", ans));
    }
}

public class UnionFind<T>
{
    private int m_height;
    private UnionFind<T> m_parent;

    public T Item { get; private set; }
    public int NumberOfChildren { get; private set; }

    public UnionFind(T item)
    {
        m_height = 0;
        m_parent = this;
        Item = item;
        NumberOfChildren = 1;
    }

    public UnionFind<T> Root()
    {
        if (m_parent == this)
        {
            return this;
        }

        UnionFind<T> parent = m_parent.Root();
        m_parent = parent;
        return parent;
    }

    public static void Unite(UnionFind<T> a, UnionFind<T> b)
    {
        UnionFind<T> p = a.Root();
        UnionFind<T> q = b.Root();
        if (p.m_height < q.m_height)
        {
            p.m_parent = q;
            q.m_height = Math.Max(p.m_height + 1, q.m_height);
            q.NumberOfChildren += p.NumberOfChildren;
        }
        else
        {
            q.m_parent = p;
            p.m_height = Math.Max(q.m_height + 1, p.m_height);
            p.NumberOfChildren += q.NumberOfChildren;
        }
    }
}
public static class Input
{
    private static Queue<string> q = new Queue<string>();
    private static void Confirm() { if (q.Count == 0) foreach (var s in Console.ReadLine().Split(' ')) q.Enqueue(s); }
    public static int NextInt() { Confirm(); return int.Parse(q.Dequeue()); }
    public static long NextLong() { Confirm(); return long.Parse(q.Dequeue()); }
    public static string NextString() { Confirm(); return q.Dequeue(); }
    public static double NextDouble() { Confirm(); return double.Parse(q.Dequeue()); }
    public static int[] LineInt() { return Console.ReadLine().Split(' ').Select(int.Parse).ToArray(); }
    public static long[] LineLong() { return Console.ReadLine().Split(' ').Select(long.Parse).ToArray(); }
    public static string[] LineString() { return Console.ReadLine().Split(' ').ToArray(); }
    public static double[] LineDouble() { return Console.ReadLine().Split(' ').Select(double.Parse).ToArray(); }
}


Measured memory_bytes: 65572