#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T read() {
  T x = 0, w = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') w = -w;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
  return x * w;
}
template <class T>
inline T read(T& x) {
  return x = read<T>();
}
const int N = 1e5 + 10;
vector<int> to[N], stk;
int sq, dep[N];
bool vis[N];
void dfs(int u, int fa) {
  stk.push_back(u);
  dep[u] = stk.size();
  for (int v : to[u])
    if (v != fa) {
      if (!dep[v])
        dfs(v, u);
      else if (dep[u] - dep[v] + 1 >= sq) {
        puts("2");
        printf("%d\n", dep[u] - dep[v] + 1);
        for (int i = dep[v] - 1; i < dep[u]; ++i) printf("%d ", stk[i]);
        exit(0);
      }
    }
  if (!vis[u]) {
    for (int v : to[u]) vis[v] = 1;
  }
  stk.pop_back();
}
int main() {
  int n = read<int>();
  sq = ceil(sqrt(n));
  for (int m = read<int>(); m--;) {
    int u = read<int>(), v = read<int>();
    to[u].push_back(v), to[v].push_back(u);
  }
  dfs(1, 0);
  puts("1");
  for (int i = 1; i <= n and sq; ++i)
    if (!vis[i]) printf("%d ", i), --sq;
  return 0;
}
