Problem: Fox Ciel is participating in a party in Prime Kingdom. There are n foxes there (include Fox Ciel). The i-th fox is ai years old.

They will have dinner around some round tables. You want to distribute foxes such that:

  1. Each fox is sitting at some table. 
  2. Each table has at least 3 foxes sitting around it. 
  3. The sum of ages of any two adjacent foxes around each table should be a prime number. 



If k foxes f1, f2, ..., fk are sitting around table in clockwise order, then for 1 ≤ i ≤ k - 1: fi and fi + 1 are adjacent, and f1 and fk are also adjacent.

If it is possible to distribute the foxes in the desired manner, find out a way to do that.

Input

The first line contains single integer n (3 ≤ n ≤ 200): the number of foxes in this party. 

The second line contains n integers ai (2 ≤ ai ≤ 104).

Output

If it is impossible to do this, output "Impossible".

Otherwise, in the first line output an integer m (<image>): the number of tables.

Then output m lines, each line should start with an integer k -=– the number of foxes around that table, and then k numbers — indices of fox sitting around that table in clockwise order.

If there are several possible arrangements, output any of them.

Examples

Input

4
3 4 8 9


Output

1
4 1 2 4 3


Input

5
2 2 2 2 2


Output

Impossible


Input

12
2 3 4 5 6 7 8 9 10 11 12 13


Output

1
12 1 2 3 6 5 12 9 8 7 10 11 4


Input

24
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25


Output

3
6 1 2 3 6 5 4
10 7 8 9 12 15 14 13 16 11 10
8 17 18 23 22 19 20 21 24

Note

In example 1, they can sit around one table, their ages are: 3-8-9-4, adjacent sums are: 11, 17, 13 and 7, all those integers are primes.

In example 2, it is not possible: the sum of 2+2 = 4 is not a prime number.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int read() {
  int res(0), sign(1);
  char c;
  while (1) {
    c = getchar();
    if ('0' <= c && c <= '9') {
      res = c - '0';
      break;
    } else if (c == '-') {
      sign = -1;
      break;
    }
  }
  while (1) {
    c = getchar();
    if ('0' <= c && c <= '9')
      res = res * 10 + c - '0';
    else
      break;
  }
  return res * sign;
}
vector<vector<int> > V;
vector<int> tmp;
pair<int, int> A[205];
int N, vis;
int visited[205];
int D[205][205], E[205][205];
bool prime(int a) {
  if (a == 2) return true;
  if (!(a & 1)) return false;
  for (int i = 3; i * i <= a; i += 2)
    if (!(a % i)) return false;
  return true;
}
int dfs(int x, int flow) {
  visited[x] = vis;
  if (x == N + 1) return flow;
  int i;
  for (i = 0; i <= N + 1; i++)
    if (visited[i] != vis && D[x][i]) {
      int t = dfs(i, min(D[x][i], flow));
      if (!t) continue;
      D[x][i] -= t;
      D[i][x] += t;
      return t;
    }
  return 0;
}
void dfs2(int x) {
  tmp.push_back(A[x].second);
  visited[x] = vis;
  int i;
  for (i = 1; i <= N; i++)
    if (visited[i] != vis && E[x][i]) dfs2(i);
}
int main() {
  int a, i, j, k(0), l;
  l = N = read();
  for (i = 1; i <= N; i++) {
    a = read();
    if (a & 1)
      A[++k] = make_pair(a, i);
    else
      A[l--] = make_pair(a, i);
  }
  for (i = 1; i <= N; i++)
    if (A[i].first & 1)
      D[0][i] = 2;
    else
      D[i][N + 1] = 2;
  for (i = 1; i <= k; i++)
    for (j = k + 1; j <= N; j++) D[i][j] = prime(A[i].first + A[j].first);
  int res(0), t(0);
  while (1) {
    vis++;
    t = dfs(0, 1000000000);
    if (!t) break;
    res += t;
  }
  if (res == 2 * k) {
    for (i = 1; i <= k; i++)
      for (j = k + 1; j <= N; j++)
        if (D[j][i]) E[i][j] = E[j][i] = true;
    vis++;
    for (i = 1; i <= N; i++)
      if (visited[i] != vis) {
        tmp.clear();
        dfs2(i);
        V.push_back(tmp);
        if (tmp.size() & 1) {
          printf("Impossible\n");
          return 0;
        }
      }
    vector<vector<int> >::iterator it;
    vector<int>::iterator it2;
    printf("%d\n", (int)V.size());
    for (it = V.begin(); it != V.end(); ++it) {
      printf("%d", (int)it->size());
      for (it2 = it->begin(); it2 != it->end(); ++it2) printf(" %d", *it2);
      printf("\n");
    }
  } else
    printf("Impossible\n");
  return 0;
}