#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#define N 10000007
#define int long long
using namespace std;
int f[N],mx,ans,a[N];
int n;
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void merge(int x,int y){
int u=x,v=y;
x=find(x),y=find(y);
if(x==y)return;
if(!x||!y)return;
printf("%lld %lld\n",u,v);
f[x]=y;ans--;
}
map<long long,bool>mp;
signed main(){
scanf("%lld",&n);ans=n;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
mx=max(mx,a[i]);
mp[a[i]]=1;
f[a[i]]=a[i];
}
for(int i=1;i<=min((int)1e14,mx*mx);i+=2*sqrt(i)+1){
for(int j=1;j<=n;j++){
double chk=sqrt(i+a[j]*a[j]);
int now=sqrt(i+a[j]*a[j]);
if(chk!=now)continue;
if(now==0)continue;
if(now==i)continue;
if(now==a[j])continue;
if(i==a[j])continue;
if(__gcd(a[j],now)==1&&__gcd(i,a[j])==1&&__gcd(now,i)==1&&mp.find(now)!=mp.end())merge(a[j],now);
}
}
for(int i=1;i<=min((int)1e14,mx*mx);i+=2*sqrt(i)+1){
for(int j=1;j<=n;j++){
double chk=sqrt(i+a[j]*a[j]);
int now=sqrt(i+a[j]*a[j]);
if(chk!=now)continue;
if(now==0)continue;
if(now==i)continue;
if(now==a[j])continue;
if(i==a[j])continue;
if(__gcd(a[j],now)==1&&__gcd(i,a[j])==1&&__gcd(now,i)==1&&mp.find(now)!=mp.end())merge(a[j],now);
}
}
printf("%lld",ans);
return 0;
}