#include <bits/stdc++.h>
using namespace std;
long long in() {
  int32_t x;
  scanf("%d", &x);
  return x;
}
inline long long lin() {
  long long x;
  scanf("%lld", &x);
  return x;
}
const long long maxn = 1e6 + 10;
long long a[maxn], odd;
vector<long long> lst[maxn];
bool mark[maxn];
int32_t main() {
  long long n = in(), k = in(), p = k - in();
  for (long long i = 0; i < n; i++) {
    a[i] = in();
    if (a[i] % 2) odd++;
  }
  if (p % 2 == odd % 2 && odd >= p) {
    long long cur = 0;
    for (long long i = 0; i < n && cur < p; i++) {
      if (a[i] % 2) {
        lst[cur++].push_back(i);
        mark[i] = true;
      }
    }
    long long rem = (n - odd) + (odd - p) / 2;
    if (rem >= k - p) {
      cout << "YES\n";
      vector<long long> odds;
      for (long long i = 0; i < n && odds.size() / 2 < k - p; i++)
        if (!mark[i] && a[i] % 2) mark[i] = true, odds.push_back(i);
      for (long long i = 0; i < odds.size(); i += 2)
        lst[cur].push_back(odds[i]), lst[cur].push_back(odds[i + 1]), cur++;
      for (long long i = 0; i < n && cur < k; i++) {
        if (a[i] % 2 == 0) {
          lst[cur++].push_back(i);
          mark[i] = true;
        }
      }
      for (long long i = 0; i < n; i++)
        if (!mark[i]) lst[cur - 1].push_back(i);
      for (long long i = 0; i < k; i++) {
        cout << lst[i].size() << " ";
        for (auto x : lst[i]) cout << a[x] << " ";
        cout << "\n";
      }
      return 0;
    } else
      return cout << "NO\n", 0;
  }
  return cout << "NO\n", 0;
}
