#include <bits/stdc++.h>   using namespace std;   const int N = 205, inf = 1e9;   int n, a[N];   int tot, lnk[N], fro[N * N * 2], nxt[N * N * 2], son[N * N * 2], c[N * N * 2],       ori[N * N * 2];   int S, T, dep[N], cur[N];   queue<int> q;   int cnt;   bool vis[N];   vector<int> ans[N];   bool isprm(int x) {     if (x == 2 || x == 3 || x == 5 || x == 7) return 1;     for (int i = 2; i <= sqrt(x); ++i)       if (x % i == 0) return 0;     return 1;   }   void add(int x, int y, int z) {     nxt[++tot] = lnk[x], lnk[x] = tot;     fro[tot] = x, son[tot] = y, c[tot] = ori[tot] = z;   }   struct Dinic {     bool bfs(int x = 0) {       memset(dep, 0, sizeof dep), dep[S] = 1;       for (; !q.empty(); q.pop())         ;       q.push(S);       for (; !q.empty();) {         x = q.front(), q.pop();         for (int j = lnk[x]; j; j = nxt[j]) {           if (!dep[son[j]] && c[j]) {             dep[son[j]] = dep[x] + 1;             q.push(son[j]);           }         }       }       return dep[T];     }     int dfs(int x, int f, int ret = 0) {       if (x == T) return f;       for (int &j = cur[x]; j; j = nxt[j]) {         if (dep[son[j]] == dep[x] + 1 && c[j]) {           int delta = dfs(son[j], min(f, c[j]));           c[j] -= delta, c[j ^ 1] += delta;           ret += delta, f -= delta;         }       }       return ret;     }     int answer(int ret = 0) {       for (; bfs();) {         for (int i = S; i <= T; ++i) cur[i] = lnk[i];         ret += dfs(S, inf);       }       return ret;     }   } network;   void dfs(int x, int s) {     vis[x] = 1, ans[cnt].push_back(x);     if (a[x] & 1) {       for (int j = lnk[x]; j; j = nxt[j]) {         if (c[j] != 0 || son[j] == S || son[j] == T) continue;         if (!vis[son[j]]) {           dfs(son[j], s);           break;         }       }     } else {       for (int j = lnk[x]; j; j = nxt[j]) {         if (c[j ^ 1] != 0 || son[j] == S || son[j] == T) continue;         if (!vis[son[j]]) {           dfs(son[j], s);           break;         }       }     }   }   int main() {     cin >> n, tot = 1, S = 0, T = n + 1;     for (int i = 1; i <= n; ++i) {       scanf( %d , &a[i]);       if (a[i] & 1)         add(S, i, 2), add(i, S, 0);       else         add(i, T, 2), add(T, i, 0);     }     for (int i = 1; i <= n; ++i) {       for (int j = 1; j <= n; ++j)         if (isprm(a[i] + a[j]) && a[i] % 2 == 1 && a[j] % 2 == 0)           add(i, j, 1), add(j, i, 0);     }     int fl = network.answer();     if (fl != n) return puts( Impossible ), 0;     for (int i = 1; i <= n; ++i)       if (a[i] & 1) {         if (!vis[i]) ++cnt, dfs(i, i);       }     printf( %d n , cnt);     for (int i = 1; i <= cnt; ++i) {       printf( %d , ans[i].size());       for (int j = 0; j < ans[i].size(); ++j) printf(  %d , ans[i][j]);       puts(  );     }     return 0;   }   