#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 250000;
vector<int> nbrs[MAX_N];
int ps[MAX_N], ds[MAX_N], dgs[MAX_N], cis[MAX_N];
int vs[MAX_N];
vector<int> ccls[MAX_N];
int makepath(int x, int y, int vs[]) {
  if (ds[x] < ds[y]) swap(x, y);
  int l = 0;
  vs[l++] = x;
  for (int v = ps[x]; v != y; v = ps[v]) vs[l++] = v;
  vs[l++] = y;
  return l;
}
int makecycle(int u, int x, int y, int vs[]) {
  int l = makepath(x, y, vs + 1);
  vs[0] = u;
  l++;
  return l;
}
int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  int pl = (n + k - 1) / k;
  for (int i = 0; i < m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    u--, v--;
    nbrs[u].push_back(v);
    nbrs[v].push_back(u);
  }
  int cn = 0;
  memset(ds, -1, sizeof(ds));
  ps[0] = -1, ds[0] = 0;
  for (int u = 0; u >= 0;) {
    vector<int> &nbru = nbrs[u];
    int up = ps[u];
    if (cis[u] < nbru.size()) {
      int v = nbru[cis[u]++];
      if (ds[v] < 0) {
        ps[v] = u, ds[v] = ds[u] + 1;
        dgs[u]++, dgs[v]++;
        u = v;
      }
    } else {
      if (ds[u] + 1 >= pl) {
        int l = makepath(u, 0, vs);
        printf("PATH\n%d\n", l);
        for (int i = 0; i < l; i++)
          printf("%d%c", vs[i] + 1, (i + 1 < l) ? ' ' : '\n');
        return 0;
      }
      if (cn < k && u != 0 && dgs[u] == 1) {
        int p0 = nbru[0], p1 = nbru[1], p2 = nbru[2], l;
        if ((l = makecycle(u, p0, p1, vs)) > 3 && l % 3 != 0)
          ccls[cn++].assign(vs, vs + l);
        else if ((l = makecycle(u, p1, p2, vs)) > 3 && l % 3 != 0)
          ccls[cn++].assign(vs, vs + l);
        else if ((l = makecycle(u, p2, p0, vs)) > 3 && l % 3 != 0)
          ccls[cn++].assign(vs, vs + l);
      }
      u = up;
    }
  }
  if (cn < k)
    puts("-1");
  else {
    puts("CYCLES");
    for (int i = 0; i < k; i++) {
      vector<int> &ccl = ccls[i];
      printf("%lu\n", ccl.size());
      for (int j = 0; j < ccl.size(); j++)
        printf("%d%c", ccl[j] + 1, (j + 1 < ccl.size()) ? ' ' : '\n');
    }
  }
  return 0;
}
