#include <bits/stdc++.h>   using namespace std;   const int maxn = 100086;   const int inf = 2.1e9;   const long long Inf = 999999999999999999;   const int mod = 1000000007;   const double eps = 1e-6;   const double pi = acos(-1);   int n, s, t;   int nums[206];   int vis[maxn], num[maxn];   int prime[maxn], cur;   bool check[maxn];   int Head[208], Next[maxn], v[maxn], w[maxn], cnt;   void init() {     memset(Head, -1, sizeof(Head));     cnt = 0;     s = 0, t = n + 1;   }   void primes() {     for (int i = 2; i < 20086; i++) {       if (!check[i]) {         prime[cur++] = i;       }       for (int j = 0; j < cur; j++) {         if (i * prime[j] > 20086) {           break;         }         check[i * prime[j]] = i;         if (i % prime[j] == 0) {           break;         }       }     }   }   void add(int x, int y, int z) {     if (x == y) {       return;     }     v[cnt] = y;     w[cnt] = z;     Next[cnt] = Head[x];     Head[x] = cnt++;     v[cnt] = x;     w[cnt] = 0;     Next[cnt] = Head[y];     Head[y] = cnt++;   }   bool bfs() {     memset(vis, 0, sizeof(vis));     for (int i = 0; i <= t; i++) {       num[i] = Head[i];     }     vis[s] = 1;     queue<int> q;     q.push(s);     int r = 0;     while (!q.empty()) {       int u = q.front();       q.pop();       int k = Head[u];       while (k != -1) {         if (!vis[v[k]] && w[k]) {           vis[v[k]] = vis[u] + 1;           q.push(v[k]);         }         k = Next[k];       }     }     return vis[t];   }   int dfs(int u, int f) {     if (u == t) {       return f;     }     int &k = num[u];     int sum = 0;     while (k != -1) {       if (vis[v[k]] == vis[u] + 1 && w[k]) {         int d = dfs(v[k], min(f, w[k]));         if (d > 0) {           w[k] -= d;           w[k ^ 1] += d;           return d;         }       }       k = Next[k];     }     return sum;   }   int Dinic() {     int ans = 0;     while (bfs()) {       int f;       while ((f = dfs(s, inf)) > 0) {         ans += f;       }     }     return ans;   }   stack<int> st;   void dfs(int t) {     vis[t] = 1;     st.push(t);     for (int k = Head[t]; k != -1; k = Next[k]) {       if (v[k] == 0 || v[k] == n + 1) {         continue;       }       if (vis[v[k]]) {         continue;       }       if (nums[t] % 2 == 0 && w[k]) {         dfs(v[k]);       }       if (nums[t] % 2 == 1 && !w[k]) {         dfs(v[k]);       }     }     vis[t] = -1;   }   queue<int> q[208];   int main() {     primes();     scanf( %d , &n);     for (int i = 1; i <= n; i++) {       scanf( %d , &nums[i]);     }     init();     for (int i = 1; i <= n; i++) {       if (nums[i] & 1) {         add(s, i, 2);       } else {         add(i, t, 2);       }       for (int j = i + 1; j <= n; j++) {         if (!check[nums[i] + nums[j]]) {           if (nums[i] & 1) {             add(i, j, 1);           } else {             add(j, i, 1);           }         }       }     }     if (Dinic() != n) {       printf( Impossible n );       return 0;     }     int numi = 0;     memset(vis, 0, sizeof(vis));     for (int i = 1; i <= n; i++) {       if (!vis[i]) {         dfs(i);         numi++;         while (!st.empty()) {           q[i].push(st.top());           st.pop();         }       }     }     printf( %d n , numi);     for (int i = 1; i <= n; i++) {       if (!q[i].empty()) {         printf( %d , q[i].size());         while (!q[i].empty()) {           printf(  %d , q[i].front());           q[i].pop();         }         printf(  n );       }     }     return 0;   }