#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
inline void amin(T &x, U y) {
  if (y < x) x = y;
}
template <typename T, typename U>
inline void amax(T &x, U y) {
  if (x < y) x = y;
}
int a[100000];
int main() {
  int n, k, p;
  scanf("%d%d%d", &n, &k, &p);
  for (int(i) = 0; (i) < (int)(n); ++(i)) scanf("%d", &a[i]);
  vector<int> eo[2];
  for (int(i) = 0; (i) < (int)(n); ++(i)) eo[a[i] & 1].push_back(i);
  vector<vector<int> > ans;
  for (int(i) = 0; (i) < (int)(k - p); ++(i)) {
    ans.push_back(vector<int>());
    if (eo[1].empty()) goto fail;
    ans.back().push_back(eo[1].back());
    eo[1].pop_back();
  }
  for (int(i) = 0; (i) < (int)(p); ++(i)) {
    ans.push_back(vector<int>());
    if (!eo[0].empty()) {
      ans.back().push_back(eo[0].back());
      eo[0].pop_back();
    } else if (eo[1].size() >= 2) {
      ans.back().push_back(eo[1].back());
      eo[1].pop_back();
      ans.back().push_back(eo[1].back());
      eo[1].pop_back();
    } else {
      goto fail;
    }
  }
  while (!eo[0].empty()) {
    ans.back().push_back(eo[0].back());
    eo[0].pop_back();
  }
  while (!eo[1].empty()) {
    if (eo[1].size() == 1) goto fail;
    ans.back().push_back(eo[1].back());
    eo[1].pop_back();
    ans.back().push_back(eo[1].back());
    eo[1].pop_back();
  }
  if (0) {
  fail:
    puts("NO");
  } else {
    puts("YES");
    for (int(i) = 0; (i) < (int)(ans.size()); ++(i)) {
      printf("%d", (int)ans[i].size());
      for (int(j) = 0; (j) < (int)(ans[i].size()); ++(j))
        printf(" %d", a[ans[i][j]]);
      puts("");
    }
  }
  return 0;
}
