func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<vector<int> > re;   vector<pair<int, int> > e, o;   int n, c[404][404], sink, Find, pre[404], flow;   bool ch[100009], visit[404];   void init() {     for (int i = 2; i * i <= 100000; i++) {       if (!ch[i]) {         for (int j = i * i; j <= 100000; j += i) ch[j] = 1;       }     }   }   void dfs(int cur) {     visit[cur] = 1;     if (cur == sink) Find = 1;     if (Find) return;     for (int i = 0; i <= sink && !Find; i++) {       if (c[cur][i] > 0 && !visit[i]) {         dfs(i);         pre[i] = cur;       }     }   }   void solve() {     init();     scanf( %d , &n);     for (int i = 0; i < n; i++) {       int a;       scanf( %d , &a);       if (a % 2)         o.push_back(pair<int, int>(a, i + 1));       else         e.push_back(pair<int, int>(a, i + 1));     }     for (int i = 0; i < o.size(); i++) {       c[0][i + 1] = 2;     }     sink = e.size() + o.size() + 1;     for (int i = 0; i < e.size(); i++) {       c[o.size() + i + 1][sink] = 2;     }     for (int i = 0; i < o.size(); i++) {       for (int j = 0; j < e.size(); j++) {         int t = o[i].first + e[j].first;         if (!ch[t]) c[i + 1][o.size() + j + 1] = 1;       }     }     for (;;) {       memset(visit, 0, sizeof(visit));       Find = 0;       dfs(0);       if (!Find) break;       flow++;       int st, en;       en = sink;       while (en) {         st = pre[en];         c[st][en]--;         c[en][st]++;         en = st;       }     }     if (flow != 2 * e.size()) {       puts( Impossible );       return;     }     memset(visit, 0, sizeof(visit));     for (int i = 1; i < sink; i++) {       if (visit[i]) continue;       vector<int> tmp;       int cur = i;       while (!visit[cur]) {         visit[cur] = 1;         if (cur <= o.size())           tmp.push_back(o[cur - 1].second);         else           tmp.push_back(e[cur - o.size() - 1].second);         for (int i = 1; i < sink; i++) {           if (!visit[i] && ((cur <= o.size() && c[i][cur] > 0) ||                             cur > o.size() && c[cur][i] > 0)) {             cur = i;             break;           }         }       }       re.push_back(tmp);     }     printf( %d n , re.size());     for (int i = 0; i < re.size(); i++) {       printf( %d  , re[i].size());       for (int j = 0; j < re[i].size(); j++) printf( %d  , re[i][j]);       puts(  );     }   }   int main(void) {     solve();     return 0;   }   