Problem: There are n piles of pebbles on the table, the i-th pile contains ai pebbles. Your task is to paint each pebble using one of the k given colors so that for each color c and any two piles i and j the difference between the number of pebbles of color c in pile i and number of pebbles of color c in pile j is at most one.

In other words, let's say that bi, c is the number of pebbles of color c in the i-th pile. Then for any 1 ≤ c ≤ k, 1 ≤ i, j ≤ n the following condition must be satisfied |bi, c - bj, c| ≤ 1. It isn't necessary to use all k colors: if color c hasn't been used in pile i, then bi, c is considered to be zero.

Input

The first line of the input contains positive integers n and k (1 ≤ n, k ≤ 100), separated by a space — the number of piles and the number of colors respectively.

The second line contains n positive integers a1, a2, ..., an (1 ≤ ai ≤ 100) denoting number of pebbles in each of the piles.

Output

If there is no way to paint the pebbles satisfying the given condition, output "NO" (without quotes) .

Otherwise in the first line output "YES" (without quotes). Then n lines should follow, the i-th of them should contain ai space-separated integers. j-th (1 ≤ j ≤ ai) of these integers should be equal to the color of the j-th pebble in the i-th pile. If there are several possible answers, you may output any of them.

Examples

Input

4 4
1 2 3 4


Output

YES
1
1 4
1 2 4
1 2 3 4


Input

5 2
3 2 4 1 3


Output

NO


Input

5 4
3 2 4 3 5


Output

YES
1 2 3
1 3
1 2 3 4
1 3 4
1 1 2 3 4

Solution (in JAVA):

Solution:
import java.awt.*;
import java.io.*;
import java.math.*;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicInteger;

import static java.lang.Math.*;

public class solver implements Runnable {
    final boolean ONLINE_JUDGE = System.getProperty("ONLINE_JUDGE") != null;
    BufferedReader in;
    PrintWriter out;
    StringTokenizer tok = new StringTokenizer("");
    String delim = " ";

    String readString() throws IOException {
        try {
            while (!tok.hasMoreTokens()) {
                tok = new StringTokenizer(in.readLine());
            }
            return tok.nextToken(delim);
        } catch (Exception e) {
            return null;
        }
    }

    int readInt() throws IOException {
        return Integer.parseInt(readString());
    }

    long readLong() throws IOException {
        return Long.parseLong(readString());
    }

    double readDouble() throws IOException {
        return Double.parseDouble(readString());
    }

    Point readPoint() throws IOException {
        return new Point(readInt(), readInt());
    }

    // ----------------------------------   
    
    int gcd(int a, int b) {
        if (a == 0) return b;
        return gcd(b % a, a);
    }   
    
    class Pair implements Comparable<Pair>{
        int a;
        int index;
        
        Pair(int a, int index){
            this.a = a;
            this.index = index;
        }

        @Override
        public int compareTo(Pair o) {
            return a - o.a;
        }
        
        
    }
    
    
    
    // ----------------------------------------
    void solve() throws NumberFormatException, IOException {
        int n = readInt();
        int k  =readInt();
        Pair[] a = new Pair[n];
        for(int i=0;i<n;i++){
            a[i] = new Pair(readInt(), i);
        }
        Arrays.sort(a);
        String[] answer = new String[n];
        answer[a[0].index] ="";
        for (int i=0;i<a[0].a;i++){
            if (i != 0) answer[a[0].index] +=" ";
            answer[a[0].index] += "1";
        }
        int max = 1;
        int cur = 1;
        while (cur < n && a[cur].a == a[0].a) {
            answer[a[cur].index] = answer[a[0].index];
            cur++;
        }
        String prev = answer[a[0].index] +" 1";
        for (int i=cur;i<n;i++){
            a[i].a --;
            int dif = a[i].a - a[i-1].a;
            while (dif --> 0) {
                max ++;
                prev += " "+max;
            }
            answer[a[i].index] = prev;
        }
        
        if (max > k) {
            out.println("NO");
            return;         
        } 
        out.println("YES");
        for (String s : answer) {
            out.println(s);
        }
    }

    // ----------------------------------------

    public static void main(String[] args) {
        new Thread(null, new solver(), "", 256 * (1L << 20)).start();
    }

    public void run() {
        try {
            timeBegin = System.currentTimeMillis();

            try {
                if (ONLINE_JUDGE) {
                    in = new BufferedReader(new InputStreamReader(System.in));
                    out = new PrintWriter(System.out);
                } else {
                    in = new BufferedReader(new FileReader("input.txt"));
                    out = new PrintWriter("output.txt");
                }
            } catch (Throwable e) {
                in = new BufferedReader(new InputStreamReader(System.in));
                out = new PrintWriter(System.out);
            }

            solve();
            out.close();

            timeEnd = System.currentTimeMillis();
            if (!ONLINE_JUDGE) System.err.println("Time = " + (timeEnd - timeBegin));
        } catch (Exception e) {
            e.printStackTrace(System.err);
            System.exit(-1);
        }
    }

    long timeBegin, timeEnd;
}