// ROOT : DRAGON3012009
#include <bits/stdc++.h>
#define ll int
#define ld long double
#define el "\n"
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define __ROOT__ int main()
#pragma GCC optimize("O2")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define fi first
#define se second
#define M 1000000007
#define MAXN 2000001
#define INF (1ll<<30)
#define BLOCK_SIZE 425
#define MAX_NODE 1001001
#define LOG 19
#define ALPHA_SIZE 26
#define BASE 256
#define NAME "file"
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
using namespace std;
using namespace chrono ;
const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
const ll NMOD = 1;
const int dx[] = {-1, 0, 1,0};
const int dy[] = {0, 1, 0, -1};
//**Variable**//
ll n ;
pair<ll,ll> arr[MAXN];
vector<pair<ll,ll>>le, chan ;
vector<ll>pos1 ;
vector<ll> value[MAXN] ;
vector<pair<ll,ll> > res ;
vector<ll> adj[MAXN] ;
ll prime[MAXN] ;
void sang() {
memset(prime, 1, sizeof prime ) ;
prime[0] = prime[1] = false ;
for(long long i = 2 ; i * i < MAXN ; i ++ ) for(ll j = i * i ; j < MAXN ; j += i ) prime[j] = false ;
}
//**Struct**//
//**Function**//
template<class X, class Y >
bool minimize(X & x, const Y &y ) {
return x > y ? x = y, 1:0 ;
}
template<class X, class Y >
bool maximize(X &x, const Y &y ) {
return x < y ? x = y, 1:0 ;
}
bool used[MAXN] ;
void init() {
cin>>n;
FOR(i,1, n) cin >> arr[i].fi, arr[i].se = i;
// sort(arr + 1 , arr + n + 1 ) ;
}
ll matchL[MAXN], matchR[MAXN], seen[MAXN], time_kuhn = 0 ;
bool kuhn(ll u ) {
if(seen[u] == time_kuhn) return false;
else seen[u] = time_kuhn ;
for(ll v : adj[u])if( ( matchR[v] == -1 || kuhn(matchR[v]) ) ) {
matchL[u] = v ;
matchR[v] = u ;
return true ;
}
return false ;
}
void solve_sub123() {
vector<ll> leftt, rightt, ones ;
FOR(i,1,n) {
if(arr[i].fi == 1 ) ones.push_back(i) ;
else if (arr[i].fi % 2 == 1) leftt.push_back(arr[i].se);
else rightt.push_back(arr[i].se);
}
memset(matchL, -1, sizeof matchL ) ;
memset(matchR, -1, sizeof matchR ) ;
for (ll u : leftt) {
for (ll v : rightt) {
if ( prime[arr[u].fi + arr[v].fi]) {
adj[u].push_back(v);
}
}
}
for(ll u : leftt) {
time_kuhn++;
kuhn(u);
}
for (ll u : ones) {
for (ll v : rightt) {
if ( prime[arr[u].fi + arr[v].fi]) {
adj[u].push_back(v);
}
}
}
for(ll u : ones ) {
time_kuhn++;
kuhn(u);
}
for (ll u : leftt) {
if (matchL[u] != -1 && !used[u] && !used[matchL[u]]) {
res.push_back({u, matchL[u]});
used[u] = used[matchL[u]] = true;
}
}
for (ll u : ones)if (matchL[u] != -1 && !used[u] && !used[matchL[u]]) {
res.push_back({u, matchL[u]});
used[u] = used[matchL[u]] = 1;
}
for (ll u : ones) if (!used[u] && matchL[u] == -1) pos1.push_back(u);
ll last = -1 ;
for(ll p : pos1 ) {
if(last == -1 ) last = p ;
else {
res.push_back({last, p }) ;
used[p] = used[last] = true ;
last = -1 ;
}
}
cout << res.size() << el ;
for(auto[u, v ] : res ) cout << u << " " << v << el ;
}
void get(ll l, ll r ) {
while (l < r ) {
res.push_back( { arr[l].se, arr[r].se } ) ;
l ++ ;
r -- ;
}
}
void solve_sub4() {
vector<pair<ll,ll> > pos;
// FOR(i, 1, n) pos.push_back({arr[i], i });
FOR(i, 1, n ) pos.push_back({arr[i].fi, i }) ;
sort(pos.begin(), pos.end());
vector<pair<ll,ll> > ans;
ll r = n - 1;
while (r > 0) {
ll l = -1;
for (ll i = 0; i < r; i++)
if (prime[pos[i].fi + pos[r].fi]) {
l = i;
break;
}
if (l == -1) {
--r;
continue;
}
ll l1 = l, rr = r;
while (l1 < rr) {
ans.push_back({pos[l1].se, pos[rr].se});
++l1;
--rr;
}
r = l - 1;
}
cout << ans.size() << el;
for (auto &p : ans) cout << p.fi << " " << p.se << el ;
return ;
}
__ROOT__ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
fast;
sang();
int t = 1; // cin >> t ;
while(t--) {
init();
if(n <= 1000 ) solve_sub123();
else
solve_sub4() ;
}
return (0&0);
}
Ly8gUk9PVCA6IERSQUdPTjMwMTIwMDkKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgaW50CiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBlbCAiXG4iCiNkZWZpbmUgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKI2RlZmluZSBfX1JPT1RfXyBpbnQgbWFpbigpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMiIpCi8vI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCi8vI3ByYWdtYSBHQ0MgdGFyZ2V0KCJhdngyLGJtaSxibWkyLHBvcGNudCxsemNudCIpCiNkZWZpbmUgRk9SKGksbCxyKSBmb3IoaW50IGkgPSBsIDsgaSA8PSByIDsgaSArKykKI2RlZmluZSBGT1JEKGkscixsKSBmb3IoaW50IGkgPSByIDsgaSA+PSBsIDsgaSAtLSkKI2RlZmluZSBSRVAoaSwgYSApIGZvcihpbnQgaSA9IDAgOyBpIDwgYSA7IGkgKysgKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgTSAxMDAwMDAwMDA3CiNkZWZpbmUgTUFYTiAyMDAwMDAxCiNkZWZpbmUgSU5GICgxbGw8PDMwKQojZGVmaW5lIEJMT0NLX1NJWkUgNDI1CiNkZWZpbmUgTUFYX05PREUgMTAwMTAwMQojZGVmaW5lIExPRyAxOQojZGVmaW5lIEFMUEhBX1NJWkUgMjYKI2RlZmluZSBCQVNFIDI1NgojZGVmaW5lIE5BTUUgImZpbGUiCiNkZWZpbmUgY29tcGFyZSh2KSBzb3J0KCh2KS5iZWdpbigpLCAodikuZW5kKCkpOyAodikuZXJhc2UodW5pcXVlKCh2KS5iZWdpbigpLCAodikuZW5kKCkpLCAodikuZW5kKCkpOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgY2hyb25vIDsKY29uc3QgbGwgTU9EW10gPSB7KGxsKTFlOSArIDIyNzcsIChsbCkxZTkgKyA1Mjc3LCAobGwpMWU5ICsgODI3NywgKGxsKTFlOSArIDkyNzcsIChsbCkgMWU5ICsgNyB9Owpjb25zdCBsbCBOTU9EID0gMTsKY29uc3QgaW50IGR4W10gPSB7LTEsIDAsIDEsMH07CmNvbnN0IGludCBkeVtdID0gezAsIDEsIDAsIC0xfTsKLy8qKlZhcmlhYmxlKiovLwpsbCBuIDsKcGFpcjxsbCxsbD4gIGFycltNQVhOXTsKdmVjdG9yPHBhaXI8bGwsbGw+PmxlLCBjaGFuIDsKdmVjdG9yPGxsPnBvczEgIDsKdmVjdG9yPGxsPiB2YWx1ZVtNQVhOXSA7CnZlY3RvcjxwYWlyPGxsLGxsPiA+IHJlcyA7CnZlY3RvcjxsbD4gYWRqW01BWE5dIDsKbGwgcHJpbWVbTUFYTl0gOwp2b2lkIHNhbmcoKSB7CiAgICBtZW1zZXQocHJpbWUsIDEsIHNpemVvZiBwcmltZSApIDsKICAgIHByaW1lWzBdID0gcHJpbWVbMV0gPSBmYWxzZSA7CgogICAgZm9yKGxvbmcgbG9uZyBpID0gMiA7IGkgKiBpIDwgTUFYTiA7IGkgKysgKSBmb3IobGwgaiA9IGkgKiBpIDsgaiA8IE1BWE4gOyBqICs9IGkgKSBwcmltZVtqXSA9IGZhbHNlIDsKfQovLyoqU3RydWN0KiovLwoKLy8qKkZ1bmN0aW9uKiovLwp0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZID4KYm9vbCBtaW5pbWl6ZShYICYgeCwgY29uc3QgWSAmeSApIHsKICAgIHJldHVybiB4ID4geSA/IHggPSB5LCAxOjAgOwp9CnRlbXBsYXRlPGNsYXNzIFgsIGNsYXNzIFkgPgpib29sIG1heGltaXplKFggJngsIGNvbnN0IFkgJnkgKSB7CiAgICByZXR1cm4geCA8IHkgPyB4ID0geSwgMTowIDsKfQpib29sIHVzZWRbTUFYTl0gOwp2b2lkIGluaXQoKSB7CiAgICBjaW4+Pm47CiAgICBGT1IoaSwxLCBuKSBjaW4gPj4gYXJyW2ldLmZpLCBhcnJbaV0uc2UgPSBpOwovLyAgICBzb3J0KGFyciArIDEgLCAgIGFyciArIG4gKyAxICkgOwp9CmxsIG1hdGNoTFtNQVhOXSwgbWF0Y2hSW01BWE5dLCBzZWVuW01BWE5dLCB0aW1lX2t1aG4gPSAwIDsKYm9vbCBrdWhuKGxsIHUgKSB7CiAgICBpZihzZWVuW3VdID09IHRpbWVfa3VobikgcmV0dXJuIGZhbHNlOwogICAgZWxzZSBzZWVuW3VdID0gdGltZV9rdWhuIDsKICAgIGZvcihsbCB2IDogYWRqW3VdKWlmKCAoIG1hdGNoUlt2XSA9PSAtMSB8fCBrdWhuKG1hdGNoUlt2XSkgKSApIHsKICAgICAgICAgICAgbWF0Y2hMW3VdID0gdiA7CiAgICAgICAgICAgIG1hdGNoUlt2XSA9IHUgOwogICAgICAgICAgICByZXR1cm4gdHJ1ZSA7CiAgICAgICAgfQogICAgcmV0dXJuIGZhbHNlIDsKfQp2b2lkIHNvbHZlX3N1YjEyMygpIHsKICAgIHZlY3RvcjxsbD4gbGVmdHQsIHJpZ2h0dCwgb25lcyA7CiAgICBGT1IoaSwxLG4pIHsKICAgICAgICBpZihhcnJbaV0uZmkgPT0gMSApIG9uZXMucHVzaF9iYWNrKGkpICA7CiAgICAgICAgZWxzZSAgaWYgKGFycltpXS5maSAlIDIgPT0gMSkgbGVmdHQucHVzaF9iYWNrKGFycltpXS5zZSk7CiAgICAgICAgZWxzZSByaWdodHQucHVzaF9iYWNrKGFycltpXS5zZSk7CiAgICB9CgogICAgbWVtc2V0KG1hdGNoTCwgLTEsIHNpemVvZiBtYXRjaEwgKSA7CiAgICBtZW1zZXQobWF0Y2hSLCAtMSwgc2l6ZW9mIG1hdGNoUiApIDsKICAgIGZvciAobGwgdSA6IGxlZnR0KSB7CiAgICAgICAgZm9yIChsbCB2IDogcmlnaHR0KSB7CiAgICAgICAgICAgIGlmICggcHJpbWVbYXJyW3VdLmZpICsgYXJyW3ZdLmZpXSkgewogICAgICAgICAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh2KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmb3IobGwgdSA6IGxlZnR0KSB7CiAgICAgICAgdGltZV9rdWhuKys7CiAgICAgICAga3Vobih1KTsKICAgIH0KCiAgICBmb3IgKGxsIHUgOiBvbmVzKSB7CiAgICAgICAgZm9yIChsbCB2IDogcmlnaHR0KSB7CiAgICAgICAgICAgIGlmICggcHJpbWVbYXJyW3VdLmZpICsgYXJyW3ZdLmZpXSkgewogICAgICAgICAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh2KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZvcihsbCB1IDogb25lcyApIHsKICAgICAgICB0aW1lX2t1aG4rKzsKICAgICAgICBrdWhuKHUpOwogICAgfQoKICAgIGZvciAobGwgdSA6IGxlZnR0KSB7CiAgICAgICAgaWYgKG1hdGNoTFt1XSAhPSAtMSAmJiAhdXNlZFt1XSAmJiAhdXNlZFttYXRjaExbdV1dKSB7CiAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soe3UsIG1hdGNoTFt1XX0pOwogICAgICAgICAgICB1c2VkW3VdID0gdXNlZFttYXRjaExbdV1dID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CgoKICAgIGZvciAobGwgdSA6IG9uZXMpaWYgKG1hdGNoTFt1XSAhPSAtMSAmJiAhdXNlZFt1XSAmJiAhdXNlZFttYXRjaExbdV1dKSB7CiAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soe3UsIG1hdGNoTFt1XX0pOwogICAgICAgICAgICB1c2VkW3VdID0gdXNlZFttYXRjaExbdV1dID0gMTsKICAgICAgICB9CiAgICBmb3IgKGxsIHUgOiBvbmVzKSBpZiAoIXVzZWRbdV0gJiYgbWF0Y2hMW3VdID09IC0xKSBwb3MxLnB1c2hfYmFjayh1KTsKICAgIGxsIGxhc3QgPSAtMSAgOwogICAgZm9yKGxsIHAgOiBwb3MxICkgewogICAgICAgIGlmKGxhc3QgPT0gLTEgKSBsYXN0ID0gcCA7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soe2xhc3QsIHAgfSkgOwogICAgICAgICAgICB1c2VkW3BdID0gdXNlZFtsYXN0XSA9IHRydWUgOwogICAgICAgICAgICBsYXN0ID0gLTEgIDsKICAgICAgICB9CiAgICB9CiAgICBjb3V0IDw8IHJlcy5zaXplKCkgPDwgZWwgOwogICAgZm9yKGF1dG9bdSwgdiBdIDogcmVzICkgY291dCA8PCB1IDw8ICIgIiA8PCB2IDw8IGVsIDsKfQp2b2lkICBnZXQobGwgbCwgbGwgciApIHsKICAgIHdoaWxlIChsIDwgciApIHsKICAgICAgICByZXMucHVzaF9iYWNrKCB7IGFycltsXS5zZSwgYXJyW3JdLnNlIH0gICkgOwogICAgICAgIGwgKysgOwogICAgICAgIHIgLS0gOwogICAgfQp9CnZvaWQgc29sdmVfc3ViNCgpIHsKICAgIHZlY3RvcjxwYWlyPGxsLGxsPiA+IHBvczsKCi8vICAgIEZPUihpLCAxLCBuKSBwb3MucHVzaF9iYWNrKHthcnJbaV0sIGkgfSk7CiAgICBGT1IoaSwgMSwgIG4gICkgcG9zLnB1c2hfYmFjayh7YXJyW2ldLmZpLCBpICAgICB9KSA7CiAgICBzb3J0KHBvcy5iZWdpbigpLCBwb3MuZW5kKCkpOwoKICAgIHZlY3RvcjxwYWlyPGxsLGxsPiA+IGFuczsKICAgIGxsIHIgPSBuIC0gMTsKICAgIHdoaWxlIChyID4gMCkgewogICAgICAgIGxsIGwgPSAtMTsKICAgICAgICBmb3IgKGxsIGkgPSAwOyBpIDwgcjsgaSsrKQogICAgICAgICAgICBpZiAocHJpbWVbcG9zW2ldLmZpICsgcG9zW3JdLmZpXSkgewogICAgICAgICAgICAgICAgbCA9IGk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIGlmIChsID09IC0xKSB7CiAgICAgICAgICAgIC0tcjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxsIGwxID0gbCwgcnIgPSByOwogICAgICAgIHdoaWxlIChsMSA8IHJyKSB7CiAgICAgICAgICAgIGFucy5wdXNoX2JhY2soe3Bvc1tsMV0uc2UsIHBvc1tycl0uc2V9KTsKICAgICAgICAgICAgKytsMTsKICAgICAgICAgICAgLS1ycjsKICAgICAgICB9CiAgICAgICAgciA9IGwgLSAxOwogICAgfQogICAgY291dCA8PCBhbnMuc2l6ZSgpIDw8IGVsOwogICAgZm9yIChhdXRvICZwIDogYW5zKSBjb3V0IDw8IHAuZmkgPDwgIiAiIDw8IHAuc2UgPDwgZWwgOwogICAgcmV0dXJuIDsKfQoKX19ST09UX18gewogICAgLy8gZnJlb3BlbihOQU1FIi5pbnAiICwgInIiICwgc3RkaW4pOwogICAgLy8gZnJlb3BlbihOQU1FIi5vdXQiICwgInciLCBzdGRvdXQpIDsKICAgIGZhc3Q7CiAgICBzYW5nKCk7CiAgICBpbnQgdCA9IDE7IC8vIGNpbiA+PiB0IDsKICAgIHdoaWxlKHQtLSkgewogICAgICAgIGluaXQoKTsKICAgICAgICBpZihuIDw9IDEwMDAgKSBzb2x2ZV9zdWIxMjMoKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHNvbHZlX3N1YjQoKSA7CiAgICB9CiAgICByZXR1cm4gKDAmMCk7Cn0K