#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
const long long INF = 1e18;
const int MAXN = 2e5 + 10;
const int MAXM = 1e4 + 500;
const int N = 5200 + 15;
const double EPS = 1e-9;
int dx[] = {1, 0, 0, -1};
int dy[] = {0, 1, -1, 0};
double len(complex<long long> a) {
  return sqrt(a.real() * a.real() + a.imag() * a.imag());
}
long long sq(complex<long long> a) {
  return a.real() * a.real() + a.imag() * a.imag();
}
complex<long long> perp(complex<long long> p) { return {-p.imag(), p.real()}; }
long long dotProduct(complex<long long> a, complex<long long> b) {
  return (conj(a) * b).real();
}
long long crossProduct(complex<long long> a, complex<long long> b) {
  return (conj(a) * b).imag();
}
long long orient(complex<long long> a, complex<long long> b,
                 complex<long long> c) {
  return crossProduct(b - a, c - a);
}
bool inDisk(complex<long long> a, complex<long long> b, complex<long long> p) {
  return dotProduct(a - p, b - p) <= 0;
}
bool onSegment(complex<long long> a, complex<long long> b,
               complex<long long> p) {
  return orient(a, b, p) == 0 && inDisk(a, b, p);
};
struct cmpX {
  bool operator()(complex<long long> a, complex<long long> b) {
    return make_pair(a.real(), a.imag()) < make_pair(b.real(), b.imag());
  }
};
struct line {
  complex<long long> v;
  long long c;
  line(complex<long long> v, long long c) : v(v), c(c) {}
  line(long long a, long long b, long long c) : v({b, -a}), c(c) {}
  line(complex<long long> p, complex<long long> q)
      : v(q - p), c(crossProduct(v, p)) {}
  long long side(complex<long long> p) { return crossProduct(v, p) - c; }
  double dist(complex<long long> p) { return abs(side(p)) / len(v); }
  line perpThrough(complex<long long> p) { return {p, p + perp(v)}; }
  bool cmpProj(complex<long long> p, complex<long long> q) {
    return dotProduct(v, p) < dotProduct(v, q);
  }
  line translate(complex<long long> t) { return {v, c + crossProduct(v, t)}; }
  complex<long long> proj(complex<long long> p) {
    return p - perp(v) * side(p) / sq(v);
  }
};
double segPoint(complex<long long> a, complex<long long> b,
                complex<long long> p) {
  if (a != b) {
    line l(a, b);
    if (l.cmpProj(a, p) && l.cmpProj(p, b)) return l.dist(p);
  }
  return min(abs(p - a), abs(p - b));
}
bool inAngle(complex<long long> a, complex<long long> b, complex<long long> c,
             complex<long long> p) {
  if (orient(a, b, c) < 0) swap(b, c);
  return orient(a, b, p) >= 0 && orient(a, c, p) <= 0;
}
bool isInsidePol(vector<complex<long long> > &a, complex<long long> b) {
  int n = a.size();
  int pos = 0, neg = 0;
  for (int i = 0; i < n - 1; i++) {
    if (onSegment(a[i], a[(i + 1) % n], b)) return false;
    line l(a[i], a[i + 1]);
    if (l.side(b) > 0)
      pos++;
    else
      neg++;
  }
  line l(a[n - 1], a[0]);
  if (l.side(b) > 0)
    pos++;
  else
    neg++;
  return ((!pos && neg == n) || (!neg && pos == n));
}
long long i, j, k;
long long n, m, t;
long long a[MAXN];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int p, k;
  cin >> n >> k >> p;
  vector<int> evens, odds;
  for (i = 1; i <= n; i++) {
    cin >> a[i];
    if (a[i] % 2)
      odds.push_back(a[i]);
    else
      evens.push_back(a[i]);
  }
  int q = k - p;
  if (odds.size() < q) {
    cout << "NO";
    return 0;
  }
  int remOdd = odds.size() - q;
  if (remOdd / 2 + evens.size() < p || remOdd % 2) {
    cout << "NO";
    return 0;
  }
  cout << "YES" << endl;
  if (p > 0) {
    for (i = 0; i < q; i++) cout << 1 << ' ' << odds[i] << endl;
    copy(odds.begin() + q, odds.end(), back_inserter(evens));
    for (i = j = 0; j < p - 1; j++, i++) {
      if (evens[i] & 1) {
        cout << 2 << ' ' << evens[i] << ' ' << evens[i + 1] << endl;
        i++;
      } else {
        cout << 1 << ' ' << evens[i] << endl;
      }
    }
    cout << evens.size() - i << ' ';
    for (; i < evens.size(); i++) cout << evens[i] << ' ';
  } else {
    copy(evens.begin(), evens.end(), back_inserter(odds));
    for (i = 0; i < q - 1; i++) cout << 1 << ' ' << odds[i] << endl;
    cout << odds.size() - (q - 1) << ' ';
    for (; i < odds.size(); i++) cout << odds[i] << ' ';
  }
  return 0;
}
