#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T max(T a, T b) {
  return a > b ? a : b;
}
template <class T>
inline T min(T a, T b) {
  return a < b ? a : b;
}
template <class T>
inline T abs(T a) {
  return a >= 0 ? a : -a;
}
static const double PI = 3.14159265358979323846;
int main() {
  int n, k, p, x, odd = 0, even;
  long long s = 0;
  cin >> n >> k >> p;
  vector<int> oddv, evenv;
  oddv.reserve(n);
  evenv.reserve(n);
  for (int i = 1; i <= n; i++) {
    cin >> x;
    s += x;
    if (x % 2)
      oddv.push_back(x);
    else
      evenv.push_back(x);
    odd += x % 2;
  }
  even = n - odd;
  if (s % 2 != (k - p) % 2 || odd < k - p) {
    cout << "NO";
    return 0;
  }
  if ((odd - (k - p)) % 2 || (odd - (k - p)) / 2 + even < p) {
    cout << "NO";
    return 0;
  }
  vector<vector<int> > po(k - p), pe(p);
  for (int i = 1; i <= k - p; i++) {
    po[i - 1].push_back(oddv.back());
    oddv.pop_back();
  }
  int j = 0;
  while (oddv.size() && j < p) {
    pe[j].push_back(oddv.back());
    oddv.pop_back();
    pe[j].push_back(oddv.back());
    oddv.pop_back();
    j++;
    j %= p;
  }
  while (evenv.size() && j < p) {
    pe[j].push_back(evenv.back());
    evenv.pop_back();
    j++;
    j %= p;
  }
  if (k - p) {
    po[0].insert(po[0].end(), oddv.begin(), oddv.end());
    po[0].insert(po[0].end(), evenv.begin(), evenv.end());
    oddv.clear();
  }
  cout << "YES\n";
  for (int i = 1; i <= k - p; i++) {
    cout << po[i - 1].size() << " ";
    for (int _i_ = 0; _i_ <= po[i - 1].size() - 1; _i_++)
      cout << po[i - 1][_i_] << " ";
    cout << "\n";
    ;
  }
  for (int i = 1; i <= p; i++) {
    cout << pe[i - 1].size() << " ";
    for (int _i_ = 0; _i_ <= pe[i - 1].size() - 1; _i_++)
      cout << pe[i - 1][_i_] << " ";
    cout << "\n";
    ;
  }
}
