#include <bits/stdc++.h>
using namespace std;
const int MAXN = 250005, ROOT = 1;
int N, M, K, depth[MAXN], parent[MAXN], path;
vector<int> edge[MAXN], back[MAXN];
void dfs(int now) {
  for (auto next : edge[now]) {
    if (depth[next] == 0) {
      parent[next] = now;
      depth[next] = depth[now] + 1;
      if (depth[next] - 1 >= (N + K - 1) / K) {
        path = next;
      }
      dfs(next);
    } else if (next != parent[now] && depth[next] < depth[now]) {
      back[now].push_back(next);
    }
  }
}
void printCycle(int now, int next) {
  cout << depth[now] - depth[next] + 1 << "\n";
  int cur = now;
  while (cur != parent[next]) {
    cout << cur << " ";
    cur = parent[cur];
  }
  cout << "\n";
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> N >> M >> K;
  for (int i = 1; i <= M; i++) {
    int x, y;
    cin >> x >> y;
    edge[x].push_back(y);
    edge[y].push_back(x);
  }
  depth[ROOT] = 1;
  parent[ROOT] = 0;
  dfs(ROOT);
  if (path != 0) {
    cout << "PATH\n";
    cout << depth[path] << "\n";
    int now = path;
    while (now != parent[ROOT]) {
      cout << now << " ";
      now = parent[now];
    }
    cout << "\n";
  } else {
    cout << "CYCLES\n";
    int cycleCnt = 0;
    for (int now = 1; cycleCnt < K && now <= N; now++) {
      if (edge[now].size() - 1 == back[now].size()) {
        vector<int> invalid;
        for (auto next : back[now]) {
          if ((depth[now] - depth[next]) % 3 != 2) {
            printCycle(now, next);
            cycleCnt++;
            break;
          } else {
            invalid.push_back(next);
          }
        }
        if (invalid.size() >= 2) {
          if (depth[invalid[0]] > depth[invalid[1]])
            swap(invalid[0], invalid[1]);
          cout << depth[invalid[1]] - depth[invalid[0]] + 2 << "\n";
          int cur = invalid[1];
          while (cur != parent[invalid[0]]) {
            cout << cur << " ";
            cur = parent[cur];
          }
          cout << now << "\n";
          cycleCnt++;
        }
      }
    }
  }
}
