#include<bits/stdc++.h>
using namespace std;

int t;
int N,vrednost;
int a[200005];

unordered_map<int,int> br_ponavljanja_a;

queue<int> sol;

bool nadesno(int trindex,int trvrednost,int trenutnia){
    if(trindex>N) return false;
    if(trvrednost>vrednost+N-trindex||trvrednost<vrednost-N+trindex) return false;
    if(trindex==N) return trvrednost==vrednost;

    // binarna pretraga
    int U=lower_bound(a+1,a+N+1,trvrednost)-a; // kada raste
    int D=upper_bound(a+1,a+N+1,trvrednost)-a; // kada opada

    while(U<=N)
        if(br_ponavljanja_a[a[U]]==0) U++;
    while(D>=1)
        if(br_ponavljanja_a[a[D]]==0) D--;

    if(br_ponavljanja_a[a[D]]>0){
        br_ponavljanja_a[a[D]]--;
        if(nadesno(trindex+1,trvrednost-1,a[D])){
            sol.push(a[D]);
            br_ponavljanja_a[a[D]]++;
            return true;
        }
        br_ponavljanja_a[a[D]]++;
    }

    if(broj_ponavljanja_a[a[D]]>0){
        br_ponavljanja_a[a[U]]--;
        if(nadesno(trindex+1,trvrednost+1,a[U])){
            sol.push(a[U]);
            br_ponavljanja_a[a[U]]++;
            return true;
        }
        br_ponavljanja_a[a[U]]++;
    }

    return false;
}

int main(){
    ios_base::sync_with_stdio(false);
    scanf("%d",&t);
    scanf("%d%d",&N,&vrednost);
    for(int i=1;i<=N;++i){
        scanf("%d",&a[i]);
        br_ponavljanja_a[a[i]]++;
    }
    sort(a+1,a+N+1);

    if(nadesno(1,0,0)) printf("DA\n");
    else{
        printf("NE\n");
        return 0;
    }

    if(t==0) return 0;
    while(!sol.empty()){
        printf("%d ",sol.front());
        sol.pop();
    }

    return 0;
}