#include <bits/stdc++.h>
using namespace std;
const int MAXN = 210;
const int MAXA = 20100;
int N;
int evens = 0, odds = 0;
int A[MAXN];
int cap[MAXN][MAXN];
bool vis[MAXN];
vector<int> adj[MAXN];
bool is_prime[MAXA];
void primes() {
  memset(is_prime, true, sizeof(is_prime));
  for (int i = 2; i < MAXA; ++i)
    if (is_prime[i])
      for (int k = i * 2; k < MAXA; k += i) is_prime[k] = false;
}
bool dfs(int cur) {
  if (cur == (N + 1)) return true;
  if (vis[cur]) return false;
  vis[cur] = true;
  for (int i = 0; i <= N + 1; ++i)
    if (cap[cur][i] && dfs(i)) {
      --cap[cur][i];
      ++cap[i][cur];
      return true;
    }
  return false;
}
void build() {
  memset(cap, 0, sizeof(cap));
  for (int i = 0; i < N; ++i) {
    if (A[i] & 1)
      cap[(N)][i] = 2;
    else
      cap[i][(N + 1)] = 2;
  }
  for (int i = 0; i < N; ++i)
    for (int k = 0; k < N; ++k)
      if ((A[i] & 1) && is_prime[A[i] + A[k]]) cap[i][k] = 1;
}
int max_flow() {
  memset(vis, false, sizeof(vis));
  int flow = 0;
  while (dfs((N))) {
    ++flow;
    memset(vis, false, sizeof(vis));
  }
  return flow;
}
void dfs2(int cur, vector<int>& ref) {
  if (vis[cur]) return;
  vis[cur] = true;
  ref.push_back(cur + 1);
  for (int nxt : adj[cur]) dfs2(nxt, ref);
}
int main() {
  cin >> N;
  for (int i = 0; i < N; ++i) {
    cin >> A[i];
    if (A[i] & 1)
      ++odds;
    else
      ++evens;
  }
  if (odds != evens) {
    cout << "Impossible\n";
    return 0;
  }
  primes();
  build();
  int flow = max_flow();
  if (flow != N) {
    cout << "Impossible\n";
    return 0;
  }
  for (int i = 0; i < N; ++i)
    for (int k = 0; k < N; ++k)
      if ((A[i] & 1) && is_prime[A[i] + A[k]] && cap[i][k] == 0) {
        adj[i].push_back(k);
        adj[k].push_back(i);
      }
  vector<vector<int>> res;
  memset(vis, false, sizeof(vis));
  for (int i = 0; i < N; ++i)
    if (!vis[i]) {
      res.push_back(vector<int>());
      dfs2(i, res.back());
    }
  cout << res.size() << '\n';
  for (vector<int>& v : res) {
    cout << v.size() << ' ';
    for (int x : v) cout << x << ' ';
    cout << '\n';
  }
  return 0;
}
