func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 205;   int read() {     int x = 0, f = 1;     char ch;     while (!isdigit(ch = getchar())) (ch ==  - ) && (f = -f);     for (x = ch ^ 48; isdigit(ch = getchar());          x = (x << 3) + (x << 1) + (ch ^ 48))       ;     return x * f;   }   vector<int> vec[N];   int n, s, t, tim, cnt = 1, a[N], head[N], vis[N], level[N], is[20010];   struct edge {     int v, w, nxt;   } e[N * N];   void add(int x, int y, int w) {     e[++cnt] = (edge){y, w, head[x]};     head[x] = cnt;     e[++cnt] = (edge){x, 0, head[y]};     head[y] = cnt;   }   void init(int n) {     is[1] = 1;     for (int i = 2; i <= n; ++i) {       if (is[i]) continue;       for (int j = i + i; j <= n; j += i) is[j] = 1;     }   }   int bfs() {     queue<int> Q;     Q.push(s);     memset(level, 0, sizeof(level));     level[s] = 1;     while (!Q.empty()) {       int x = Q.front();       Q.pop();       for (int i = head[x]; i; i = e[i].nxt) {         int v = e[i].v, w = e[i].w;         if (w && !level[v]) level[v] = level[x] + 1, Q.push(v);       }     }     return level[t] != 0;   }   int dfs(int x, int flow) {     if (x == t || !flow) return flow;     int up = 0;     for (int i = head[x]; i; i = e[i].nxt) {       int v = e[i].v, w = e[i].w;       if (w && level[v] == level[x] + 1) {         int tmp = dfs(v, min(flow, w));         e[i].w -= tmp, e[i ^ 1].w += tmp;         flow -= tmp, up += tmp;         if (!flow) break;       }     }     if (!up) level[x] = 0;     return up;   }   int Dinic() {     int maxflow = 0;     while (bfs()) maxflow += dfs(s, 2e9);     return maxflow;   }   void find(int x) {     vis[x] = 1;     vec[tim].push_back(x);     for (int i = head[x]; i; i = e[i].nxt)       if (!vis[e[i].v] && e[i | 1].w == 1) find(e[i].v);   }   int main() {     n = read();     s = 0;     t = n + 1;     init(20000);     for (int i = 1; i <= n; ++i) a[i] = read();     for (int i = 1; i <= n; ++i)       if (a[i] & 1)         add(i, t, 2);       else         add(s, i, 2);     for (int i = 1; i <= n; ++i) {       if (a[i] & 1) continue;       for (int j = 1; j <= n; ++j)         if (!is[a[i] + a[j]]) add(i, j, 1);     }     if (Dinic() != n) return puts( Impossible ), 0;     for (int i = 1; i <= n; ++i)       if (!vis[i]) ++tim, find(i);     printf( %d n , tim);     for (int i = 1; i <= tim; ++i) {       printf( %d  , vec[i].size());       for (int j = 0; j < vec[i].size(); ++j) printf( %d  , vec[i][j]);       puts(  );     }     return 0;   }   