#include <bits/stdc++.h>
using namespace std;
inline bool EQ(double a, double b) { return fabs(a - b) < 1e-9; }
const int INF = (((1 << 30) - 1) << 1) + 1;
const int nINF = 1 << 31;
const int N = 3e5 + 10;
int n, m, k, len, onpath[N], vis[N], cyc, pathid[N];
vector<int> g[N], cycles[N], path;
void anspath() {
  cout << "PATH" << endl;
  cout << path.size() << endl;
  for (int x : path) cout << x << ' ';
  cout << endl;
  exit(0);
}
void anscycle() {
  cout << "CYCLES" << endl;
  for (int i = 0; i < (cyc); i++) {
    cout << cycles[i].size() << endl;
    for (int v : cycles[i]) cout << v << ' ';
    cout << endl;
  }
  exit(0);
}
void addcycle(int rep) {
  vector<int> nb;
  for (int v : g[rep]) {
    if (onpath[v]) {
      nb.push_back(pathid[v]);
      if (nb.size() == 3) break;
    }
  }
  sort(nb.begin(), nb.end());
  vector<int>& cur = cycles[cyc++];
  int l, r;
  if ((nb[1] - nb[0]) % 3 != 1) {
    l = nb[0], r = nb[1];
  } else if ((nb[2] - nb[1]) % 3 != 1) {
    l = nb[1], r = nb[2];
  } else {
    l = nb[0], r = nb[2];
  }
  cur.push_back(rep);
  for (int i = (l); i <= (r); i++) cur.push_back(path[i]);
  if (cyc >= k) anscycle();
}
void dfs(int s) {
  onpath[s] = 1;
  pathid[s] = path.size();
  vis[s] = 1;
  path.push_back(s);
  bool leaf = true;
  for (int v : g[s]) {
    if (!vis[v]) {
      leaf = false;
      dfs(v);
    }
  }
  if (path.size() >= len) anspath();
  if (leaf) addcycle(s);
  path.pop_back();
  pathid[s] = -1;
  onpath[s] = 0;
}
signed main() {
  ios::sync_with_stdio(false);
  memset(pathid, -1, sizeof(pathid));
  cin >> n >> m >> k;
  len = (n + k - 1) / k;
  for (int i = 0; i < (m); i++) {
    int u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs(1);
  return 0;
}
