You are given an undirected graph without self-loops or multiple edges which consists of n vertices and m edges. Also you are given three integers n_1, n_2 and n_3.

Can you label each vertex with one of three numbers 1, 2 or 3 in such way, that: 

  1. Each vertex should be labeled by exactly one number 1, 2 or 3; 
  2. The total number of vertices with label 1 should be equal to n_1; 
  3. The total number of vertices with label 2 should be equal to n_2; 
  4. The total number of vertices with label 3 should be equal to n_3; 
  5. |col_u - col_v| = 1 for each edge (u, v), where col_x is the label of vertex x. 



If there are multiple valid labelings, print any of them.

Input

The first line contains two integers n and m (1 ≤ n ≤ 5000; 0 ≤ m ≤ 10^5) — the number of vertices and edges in the graph.

The second line contains three integers n_1, n_2 and n_3 (0 ≤ n_1, n_2, n_3 ≤ n) — the number of labels 1, 2 and 3, respectively. It's guaranteed that n_1 + n_2 + n_3 = n.

Next m lines contan description of edges: the i-th line contains two integers u_i, v_i (1 ≤ u_i, v_i ≤ n; u_i ≠ v_i) — the vertices the i-th edge connects. It's guaranteed that the graph doesn't contain self-loops or multiple edges.

Output

If valid labeling exists then print "YES" (without quotes) in the first line. In the second line print string of length n consisting of 1, 2 and 3. The i-th letter should be equal to the label of the i-th vertex.

If there is no valid labeling, print "NO" (without quotes).

Examples

Input


6 3
2 2 2
3 1
5 4
2 5


Output


YES
112323


Input


5 9
0 2 3
1 2
1 3
1 5
2 3
2 4
2 5
3 4
3 5
4 5


Output


NO

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;

public class E {

    static class Pair{
        int first, second;
        public Pair(int first, int second){
            this.first = first;
            this.second = second;
        }
    }
    private static Pair dfs(int current, int previousColor, ArrayList<Integer>[] graph, boolean[] visited, int[] colors){
        int currentColor = 1;
        if(previousColor == 1){
            currentColor = 2;
        }
        Pair pair;
        colors[current] = currentColor;
        visited[current] = true;
        if(currentColor == 1){
            pair = new Pair(1, 0);
        }else{
            pair = new Pair(0, 1);
        }
        if(graph[current] != null){
            for(Integer next : graph[current]){
                if(!visited[next]){
                    visited[next] = true;
                    Pair p = dfs(next, currentColor, graph, visited, colors);
                    if(p == null) return null;
                    pair.first += p.first;
                    pair.second += p.second;
                }else {
                    if(colors[next] == currentColor)
                        return null;
                }
            }
        }
        return pair;
    }

    private static Pair dfs2(int current, int previousColor, ArrayList<Integer>[] graph, boolean[] visited, int[] labels){
        int currentColor = 1;
        if(previousColor == 1){
            currentColor = 2;
        }
        labels[current] = currentColor;
        Pair pair;
        visited[current] = true;
        if(currentColor == 1){
            pair = new Pair(1, 0);
        }else{
            pair = new Pair(0, 1);
        }
        if(graph[current] != null){
            for(Integer next : graph[current]){
                if(!visited[next]){
                    visited[next] = true;
                    Pair p = dfs(next, currentColor, graph, visited, labels);
                    if(p == null) return null;
                    pair.first += p.first;
                    pair.second += p.second;
                }
            }
        }
        return pair;
    }

    static int[][] dp;
    private static boolean calculate(List<Pair> list, int n, int current, int sum, int size){
        if(current >= list.size() && (n == 0 || size - sum == n)) return true;
        if(current >= list.size()) return false;
        if(n < 0) return false;
        if(dp[n][current] != 0){
            if(dp[n][current] == -1) return false;
            return true;
        }
        boolean b1 = calculate(list, n - list.get(current).first, current + 1, sum + list.get(current).first + list.get(current).second, size);
        boolean b2 = calculate(list, n - list.get(current).second, current + 1, sum + list.get(current).first + list.get(current).second, size);
        if(b1 || b2){
            dp[n][current] = 1;
        }else{
            dp[n][current] = -1;
        }
        return b1 || b2;
    }
    public static void main(String[] args) throws IOException{
        Reader sc = new Reader();
        int n = sc.nextInt();
        int m = sc.nextInt();
        int n1 = sc.nextInt();
        int n2 = sc.nextInt();
        int n3 = sc.nextInt();
        ArrayList<Integer>[] graph = new ArrayList[n];
        for(int i = 0; i < m; i++){
            int u = sc.nextInt() - 1;
            int v = sc.nextInt() - 1;
            if(graph[u] == null) graph[u] = new ArrayList<>();
            if(graph[v] == null) graph[v] = new ArrayList<>();
            graph[u].add(v);
            graph[v].add(u);
        }

        boolean[] visited = new boolean[n];

        List<Pair> list = new ArrayList<>();
        int[] colors = new int[n];
        for(int i = 0; i < n; i++){
            if(!visited[i] && graph[i] != null){
                Pair pair = dfs(i, 0, graph, visited, colors);
                if(pair == null){
                    System.out.println("NO");
                    return;
                }
                list.add(pair);
            }
        }

        dp = new int[n2+1][list.size()];

        if(calculate(list, n2, 0, 0, n)){
            System.out.println("YES");
            int[] labels = new int[n];
            Arrays.fill(visited, false);
            int count = 0;
            int cc = n2;
            for(int i = 0; i < n; i++){
                if(!visited[i] && graph[i] != null){
                    if(calculate(list, cc - list.get(count).second, count + 1, 0, n)){
                        dfs2(i, 2, graph, visited, labels);
                        cc -= list.get(count).second;
                    }
                    else{
                        dfs2(i, 1, graph, visited, labels);
                        cc -= list.get(count).first;
                    }
                    count++;
                }
            }
            int x = n1;
            int y = n3;
            int abc = n2;
            for(int i = 0; i < n; i++){
                if(labels[i] == 2) abc--;
            }
            for(int i = 0; i < n; i++){
                if(labels[i] == 1){
                    if(x > 0){
                        labels[i] = 1;
                        x--;
                    }else if(y > 0){
                        labels[i] = 3;
                        y--;
                    }
                }
            }
            for(int i = 0; i < n; i++){
                if(labels[i] == 0){
                    if(x > 0){
                        labels[i] = 1;
                        x--;
                    }else if(y > 0){
                        labels[i] = 3;
                        y--;
                    }else{
                        labels[i] = 2;
                        abc--;
                    }
                }
                System.out.print(labels[i]);
            }
        }else{
            System.out.println("NO");
        }
    }

    /** Faster input **/
    static class Reader {
        final private int BUFFER_SIZE = 1 << 32;private DataInputStream din;private byte[] buffer;private int bufferPointer, bytesRead;
        public Reader(){din=new DataInputStream(System.in);buffer=new byte[BUFFER_SIZE];bufferPointer=bytesRead=0;}
        public Reader(String file_name)throws IOException {din=new DataInputStream(new FileInputStream(file_name));buffer=new byte[BUFFER_SIZE];bufferPointer=bytesRead=0;}
        public String readLine()throws IOException{byte[] buf=new byte[1024*16];int cnt=0,c;
            while((c=read())!=-1){if(c=='\n')break;buf[cnt++]=(byte)c;}return new String(buf,0,cnt);}
        public int nextInt()throws IOException{int ret=0;byte c=read();while(c<=' ')c=read();boolean neg=(c=='-');
            if(neg)c=read();do{ret=ret*10+c-'0';}while((c=read())>='0'&&c<='9');if(neg)return -ret;return ret;}
        public long nextLong()throws IOException{long ret=0;byte c=read();while(c<=' ')c=read();boolean neg=(c=='-');
            if(neg)c=read();do{ret=ret*10+c-'0';}while((c=read())>='0'&&c<='9');if(neg)return -ret;return ret;}
        public double nextDouble()throws IOException{double ret=0,div=1;byte c=read();while(c<=' ')c=read();boolean neg=(c=='-');if(neg)c = read();do {ret=ret*10+c-'0';}while((c=read())>='0'&&c<='9');
            if(c=='.')while((c=read())>='0'&&c<='9')ret+=(c-'0')/(div*=10);if(neg)return -ret;return ret;}
        private void fillBuffer()throws IOException{bytesRead=din.read(buffer,bufferPointer=0,BUFFER_SIZE);if(bytesRead==-1)buffer[0]=-1;}
        private byte read()throws IOException{if(bufferPointer==bytesRead)fillBuffer();return buffer[bufferPointer++];}
        public void close()throws IOException{if(din==null) return;din.close();}
    }
}
