There are n coins labeled from 1 to n. Initially, coin c_i is on position i and is facing upwards ((c_1, c_2, ..., c_n) is a permutation of numbers from 1 to n). You can do some operations on these coins. 

In one operation, you can do the following:

  * Choose 2 distinct indices i and j.

  * Then, swap the coins on positions i and j.

  * Then, flip both coins on positions i and j. (If they are initially faced up, they will be faced down after the operation and vice versa)




Construct a sequence of at most n+1 operations such that after performing all these operations the coin i will be on position i at the end, facing up.

Note that you do not need to minimize the number of operations.

Input

The first line contains an integer n (3 ≤ n ≤ 2 ⋅ 10^5) — the number of coins.

The second line contains n integers c_1,c_2,...,c_n (1 ≤ c_i ≤ n, c_i ≠ c_j for i≠ j).

Output

In the first line, output an integer q (0 ≤ q ≤ n+1) — the number of operations you used.

In the following q lines, output two integers i and j (1 ≤ i, j ≤ n, i ≠ j) — the positions you chose for the current operation.

Examples

Input


3
2 1 3


Output


3
1 3
3 2
3 1


Input


5
1 2 3 4 5


Output


0

Note

Let coin i facing upwards be denoted as i and coin i facing downwards be denoted as -i.

The series of moves performed in the first sample changes the coins as such:

  * [~~~2,~~~1,~~~3] 
  * [-3,~~~1,-2] 
  * [-3,~~~2,-1] 
  * [~~~1,~~~2,~~~3] 



In the second sample, the coins are already in their correct positions so there is no need to swap.
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <set>
#include <map>
#include <algorithm>

#define X first
#define Y second
#define PB push_back
#define EB emplace_back

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair < int, int > pii;
typedef vector < int > vi;

const int N = 1e6 + 500;
const int LOG = 18;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7; //
const int OFF = (1 << LOG);
const ld EPS = 1e-9;

inline int add(int A, int B) { if(A + B >= MOD); return A + B - MOD; return A + B; }
inline int sub(int A, int B) { if(A - B < 0) return A - B + MOD; return A - B; }
inline int mul(int A, int B) { return (ll)A * B % MOD; }

int n, p[N], bio[N];
vector < pii > parovi, sol;
vector < vi > svi;

void rijesi1(vi &A){
	if((int)A.size() == 2){
		int x = 1;
		while(A[0] == x || A[1] == x) x++;
		sol.PB({A[0], x});
		sol.PB({A[1], x});
		sol.PB({A[0], x});
		return;
	}
	sol.PB({A[0], A.back()});
	sol.PB({A[0], A[1]});
	sol.PB({A[1], A.back()});
	for(int x : A)
		if(x != A[1] && x != A[0])
			sol.PB({x, A[0]});
}

void rijesi2(vi &A, vi &B){
	sol.PB({A[0], B[0]});
	for(int x : A)
		if(x != A[0])
			sol.PB({B[0], x});
	for(int x : B)
		if(x != B[0])
			sol.PB({A[0], x});
	sol.PB({A[0], B[0]});
}

int main(){
	scanf("%d", &n);
	for(int i = 1;i <= n;i++)
		scanf("%d", p + i);
	for(int i = 1;i <= n;i++){
		if(bio[i]) continue;
		int cur = p[i];
		vi cik;
		while(!bio[cur]){
			cik.PB(cur); 
			bio[cur] = 1;
			cur = p[cur];
		}
		if((int)cik.size() == 1) continue;
		svi.PB(cik);
	}
	for(int i = 0;i + 1 < (int)svi.size();i += 2)
		rijesi2(svi[i], svi[i + 1]);
	if((int)svi.size() & 1)
		rijesi1(svi.back());
	printf("%d\n", (int)sol.size());
	for(pii tmp : sol){
		printf("%d %d\n", tmp.X, tmp.Y);
		swap(p[tmp.X], p[tmp.Y]);
		p[tmp.X] *= -1; p[tmp.Y] *= -1;
	}
	return 0;
	for(int i = 1;i <= n;i++)
		printf("%d ", p[i]);
	printf("\n");
	return 0;
}






