#include <bits/stdc++.h>
using namespace std;
constexpr int inf32 = 0x3f3f3f3f;
constexpr long long inf64 = 0x3f3f3f3f3f3f3f3f;
struct tree {
  int n, k;
  vector<int> d, leaf;
  vector<vector<int> > adj, fa;
  tree(int n)
      : n(n),
        k(log2(n) + 2),
        d(n + 1, -1),
        adj(n),
        fa(k, vector<int>(n + 1, n)) {}
  int &father(int u) { return fa[0][u]; }
  void adde(int u, int v) {
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  void dfs(int u) {
    for (int i = 0; i < (k - 1); ++i) fa[i + 1][u] = fa[i][fa[i][u]];
    bool nl = false;
    for (const int &v : adj[u]) {
      if (~d[v]) continue;
      father(v) = u, d[v] = d[u] + 1, dfs(v);
      nl = true;
    }
    if (!nl) leaf.push_back(u);
  }
  int lca(int u, int v) {
    if (d[u] < d[v]) swap(u, v);
    for (int i = (k)-1; i >= 0; --i)
      if (d[fa[i][u]] >= d[v]) u = fa[i][u];
    if (u == v) return u;
    for (int i = (k)-1; i >= 0; --i)
      if (fa[i][u] != fa[i][v]) u = fa[i][u], v = fa[i][v];
    return father(u);
  }
  bool cycle(int u, int v, vector<int> &a) {
    int w = lca(u, v);
    if ((d[u] + d[v] + 1 - 2 * d[w]) % 3 == 0) return false;
    vector<int> temp;
    for (int first = u; first != w; first = father(first)) a.push_back(first);
    a.push_back(w);
    for (int first = v; first != w; first = father(first))
      temp.push_back(first);
    reverse((temp).begin(), (temp).end());
    a.insert(a.end(), (temp).begin(), (temp).end());
    return true;
  }
  void build() { d[0] = 1, dfs(0); }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  int n, m, k;
  cin >> n >> m >> k;
  tree T(n);
  for (int i = 0; i < (m); ++i) {
    int u, v;
    cin >> u >> v, --u, --v;
    T.adde(u, v);
  }
  T.build();
  int mx = -1;
  for (const int &u : T.leaf)
    if (!~mx || T.d[u] > T.d[mx]) mx = u;
  if (T.d[mx] >= n / k) {
    cout << "PATH\n";
    cout << T.d[mx] << '\n';
    for (int u = mx; u != n; u = T.father(u)) cout << u + 1 << ' ';
    cout << '\n';
  } else {
    cout << "CYCLES\n";
    for (int i = 0; i < (k); ++i) {
      int u = T.leaf[i], v = -1, w = -1;
      for (const int &first : T.adj[u]) {
        if (first == T.father(u)) continue;
        if (!~v)
          v = first;
        else if (!~w)
          w = first;
        else
          break;
      }
      vector<int> res;
      if (T.cycle(u, v, res))
        ;
      else if (T.cycle(u, w, res))
        ;
      else {
        res.push_back(u);
        T.cycle(v, w, res);
      }
      cout << (int)((res).size()) << '\n';
      for (const int &u : res) cout << u + 1 << ' ';
      cout << '\n';
    }
  }
  return 0;
}
