func_code_string: #include <bits/stdc++.h>   using namespace std;   int N;   int A[205];   int cnt[2];   bitset<20005> compo;   int cap[205][205];   int par[205];   int macflow;   vector<int> pp[205];   vector<int> adj[205];   void edge(int u, int v, int c) {     cap[u][v] = c;     adj[u].push_back(v);     adj[v].push_back(u);   }   void match(int u, int v) {     pp[u].push_back(v);     pp[v].push_back(u);   }   void input() {     scanf( %d , &N);     for (int i = 2; i <= 20000; i++) {       if (compo[i]) continue;       for (int j = i * i; j <= 20000; j += i) {         compo[j] = 1;       }     }     for (int i = 1; i <= N; i++) {       scanf( %d , &A[i]);       if (A[i] & 1)         edge(0, i, 2);       else         edge(i, 201, 2);       for (int j = 1; j < i; j++) {         if (compo[A[i] + A[j]] == 0) {           if (A[i] & 1)             edge(i, j, 1);           else             edge(j, i, 1);         }       }     }   }   void DFS(int u) {     if (u == 201) return;     for (int v : adj[u]) {       if (cap[u][v] == 0) continue;       if (par[v] == -1) {         par[v] = u;         DFS(v);       }       if (par[201] != -1) return;     }   }   int augment(int u, int c) {     if (u == 0) return c;     if (par[u] != -1) {       int flow = augment(par[u], min(c, cap[par[u]][u]));       cap[par[u]][u] -= flow;       cap[u][par[u]] += flow;       return flow;     }     return 0;   }   bool vis[205];   int pa;   vector<int> res[100];   void DFS2(int u, int p) {     vis[u] = 1;     res[pa].push_back(u);     for (int v : pp[u]) {       if (vis[v]) continue;       DFS2(v, u);     }   }   void ford() {     while (1) {       memset(par, -1, sizeof(par));       par[0] = -2;       DFS(0);       int flow = augment(201, 1000000);       if (flow == 0) break;       macflow += flow;     }     if (macflow != N) {       puts( Impossible );       return;     }     for (int i = 1; i <= N; i++) {       for (int j = i + 1; j <= N; j++) {         if (compo[A[i] + A[j]] == 0) {           if (A[i] & 1) {             if (cap[j][i] == 1) {               match(i, j);             }           } else {             if (cap[i][j] == 1) {               match(i, j);             }           }         }       }     }     for (int i = 1; i <= N; i++) {       if (vis[i]) continue;       pa++;       DFS2(i, 0);     }     printf( %d n , pa);     for (int i = 1; i <= pa; i++) {       printf( %d  , (int)res[i].size());       for (int now : res[i]) {         printf( %d  , now);       }       putchar(  n );     }     cin >> N;   }   int main() {     input();     ford();   }   