using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
class abc049_d {
    static int __cnt = 0;
    static string __mark = "###";
    static void Main(string[] args) {
#if LOCAL_ENVIRONMENT
        StreamReader __sr = new StreamReader("stdin.txt");
        string __str = __sr.ReadToEnd();
        __sr.Close();
        int __index = __str.IndexOf(__mark, 0);
        while (__index != -1) {
            __index = __str.IndexOf(__mark, __index + __mark.Length);
            __cnt++;
        }
        if (__cnt > 0) {
            Console.Write("Eenter test data no(1-{0})? ", __cnt);
            Console.Out.Flush();
            if (!int.TryParse(Console.ReadLine(), out __cnt)) __cnt = 1;
            Console.WriteLine("Select/Default test data: {0}", __cnt);
        }
        var stdin = new System.IO.StreamReader("stdin.txt");
        Console.SetIn(stdin);
#endif
        SimpleScanner sc = new SimpleScanner(__cnt);
        int N = sc.NextInt(), K = sc.NextInt(), L = sc.NextInt();
#if LOCAL_ENVIRONMENT
    Console.Error.WriteLine($"N:{N}, K:{K}, L:{L}");
#endif
        var U1 = new UnionFind(N);
        for (var m = 0; m < K; m++) {
            int p = sc.NextInt() - 1, q = sc.NextInt() - 1;
#if LOCAL_ENVIRONMENT
    Console.Error.WriteLine($"p:{p}, q:{q}");
#endif
            U1.unite(p, q);
        }
        var U2 = new UnionFind(N);
        for (var m = 0; m < L; m++) {
            int r = sc.NextInt() - 1, s = sc.NextInt() - 1;
#if LOCAL_ENVIRONMENT
    Console.Error.WriteLine($"r:{r}, s:{s}");
#endif
            U2.unite(r, s);
        }
#if LOCAL_ENVIRONMENT
  Console.Error.WriteLine($"UnionFind_1: {U1.par.ToStringA()}");
  Console.Error.WriteLine($"UnionFind_2: {U2.par.ToStringA()}");
#endif

        var C = new Dictionary<Item, int>();
        for (var m = 0; m < N; m++) {
            var item = new Item(U1.root(m), U2.root(m));
            int n;
            if (C.ContainsKey(item)) n = C[item];
            else C.Add(item, n = 0);
            C[item] = ++n;
        }

        var ans = new StringBuilder();
        for (var m = 0; m < N; m++) {
            var item = new Item(U1.root(m), U2.root(m));
            int n;
            if (C.ContainsKey(item)) n = C[item];
            else n = 0;
            if (m > 0) ans.Append(" ");
            ans.Append(n.ToString());
        }
        Console.WriteLine(ans);
    } //Main

    public class Item: IEquatable<Item> {
        public int u1 { get; set; }
        public int u2 { get; set; }
        public Item(int u1, int u2) {
            this.u1 = u1;
            this.u2 = u2;
        }
        public bool Equals(Item other) {
            if (other == null) return false;
            return (this.u1 == other.u1 && this.u2 == other.u2);
        }
        public override bool Equals(Object obj) {
            if (obj == null) return false;
            Item other = obj as Item;
            return this.Equals(other);
        }
        public override int GetHashCode() {
            long u = this.u1 << 32 | this.u2;
            return u.GetHashCode();
        }
        public override string ToString() {
            return $"[u1:{this.u1}, u2:{this.u2}]";
        }
    }

    public class UnionFind {
        public int[] rank, par, size;
        public UnionFind(int n) {
            this.rank = new int[n];
            this.par = new int[n];
            this.size = new int[n];
            for (var i = 0; i < n; i++) {
                this.par[i] = i;
                this.size[i] = 1;
            }
        }
        public int find(int x) {
            if (this.par[x] == x) return x;
            return this.par[x] = this.find(this.par[x]);
        }
        public bool union(int x, int y) {
            var rx = this.root(x);
            var ry = this.root(y);
            if (rx == ry) return false;

            if (this.rank[rx] < this.rank[ry]) {
                int w = rx; rx = ry; ry = w; 
            } else if (this.rank[rx] == this.rank[ry]) {
                this.rank[rx] += 1;
            }
            this.par[ry] = rx;
            this.size[rx] += this.size[ry];
            return true;
        }
        public bool isSame(int x, int y) {
            return this.root(x) == this.root(y);
        }
        public int getSize(int x) {
            return this.size[this.find(x)];
        }
        public int root(int x) { return this.find(x); }
        public bool unite(int x, int y) { return this.union(x, y); }
    }

    public class SimpleScanner {
        private int cnt;
        private string[] items;
        public SimpleScanner(int cnt = 0) {
            this.cnt = 0;
            var sb = new StringBuilder();
            var s = Console.ReadLine();
            while (s != null) {
                sb.Append(s + " ");
                s = Console.ReadLine();
            }
            this.items = sb.ToString().Split(' ');
#if LOCAL_ENVIRONMENT
            if (cnt > 0) {
                int index = Array.IndexOf(this.items, __mark + cnt.ToString());
                this.cnt = index + 1;
            }
            Console.Error.WriteLine("SimpleScanner.cnt: {0}", this.cnt);
            Console.Error.WriteLine("SimpleScanner.items: {0}", this.items.ToStringA());
#endif
        }
        public void SetCnt(int n) { this.cnt = n; }
        public int NextInt() {
            return int.Parse(this.items[this.cnt++]);
        }
        public long NextLong() {
            return long.Parse(this.items[this.cnt++]);
        }
        public string NextString() {
            return this.items[this.cnt++];
        }
        public int[] NextIntArray(int n) {
            if (n < 1) throw new IndexOutOfRangeException("引数は1以上であること！");
            var result = new int[n];
            for (var i = 0; i < n; i++) result[i] = this.NextInt();
#if LOCAL_ENVIRONMENT
            Console.Error.WriteLine("{0}", result.ToStringA());
#endif
            return result;
        }
        public long[] NextLongArray(int n) {
            if (n < 1) throw new IndexOutOfRangeException("引数は1以上であること！");
            var result = new long[n];
            for (var i = 0; i < n; i++) result[i] = this.NextLong();
#if LOCAL_ENVIRONMENT
            Console.Error.WriteLine("{0}", result.ToStringA());
#endif
            return result;
        }
        public string[] NextStringArray(int n) {
            if (n < 1) throw new IndexOutOfRangeException("引数は1以上であること！");
            var result = new string[n];
            for (var i = 0; i < n; i++) result[i] = this.NextString();
#if LOCAL_ENVIRONMENT
            Console.Error.WriteLine("{0}", result.ToStringA());
#endif
            return result;
        }
        public int[][] NextInt2Col(int n) {
            const int M = 2;
            if (n < 1) throw new IndexOutOfRangeException("引数は1以上であること！");
            int[][] result = new int[M][] {
                new int[n],
                new int[n],
            };
            for (var i = 0; i < n; i++) {
                result[0][i] = this.NextInt();
                result[1][i] = this.NextInt();
            }
#if LOCAL_ENVIRONMENT
            Console.Error.WriteLine("NextInt2Col: [");
            for (var i = 0; i < M; i++)
                Console.Error.WriteLine("  {0},", result[i].ToStringA());
            Console.Error.WriteLine("]");
#endif
            return result;
        }
    }

}
static class Extensions {
    public static string ToStringA<T>(this T[] array, string separator = ", ", string braces = "[]") {
        string bL = braces.Length > 0 ? braces[0].ToString() : "";
        string bR = braces.Length > 1 ? braces[1].ToString() : "";
        return bL + String.Join(separator, array) + bR;
    }
}

Measured memory_bytes: 57716