#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
template <typename T, typename TT>
inline ostream &operator<<(ostream &os, const pair<T, TT> &t) {
  return os << t.first << " " << t.second;
}
template <typename T>
inline ostream &operator<<(ostream &os, const vector<T> &t) {
  for (auto i : t) os << i << " ";
  return os;
}
template <typename T>
inline istream &operator>>(istream &is, vector<T> &v) {
  for (T &t : v) is >> t;
  return is;
}
template <typename T1, typename T2>
inline istream &operator>>(istream &is, pair<T1, T2> &t) {
  is >> t.first >> t.second;
  return is;
}
const long long mod = 1e9 + 7;
bool check(long long num) {
  while (num) {
    long long r = num % 10;
    if (r != 4 and r != 7) return 0;
    num /= 10;
  }
  return 1;
}
void solve() {
  long long n;
  cin >> n;
  vector<long long> v(n);
  cin >> v;
  map<long long, set<long long>> inv;
  long long e = -1;
  for (int i = 0; i < n; i++) {
    inv[v[i]].insert(i);
    if (check(v[i])) e = v[i];
  }
  vector<long long> v1 = v;
  sort(v.begin(), v.end());
  ;
  if (e == -1) {
    if (v1 != v)
      cout << -1 << '\n';
    else
      cout << 0 << '\n';
    return;
  }
  auto swp = [&](int i, int j) {
    inv[v1[i]].erase(inv[v1[i]].find(i));
    inv[v1[j]].erase(inv[v1[j]].find(j));
    inv[v1[i]].insert(j);
    inv[v1[j]].insert(i);
    swap(v1[i], v1[j]);
  };
  vector<pair<long long, long long>> ans;
  for (int i = 0; i < n; i++) {
    if (v[i] == e) continue;
    if (i != *inv[e].begin()) {
      ans.push_back({i + 1, *inv[e].begin() + 1});
      swp(i, *inv[e].begin());
      ;
    }
    if (i != *inv[v[i]].begin()) {
      ans.push_back({i + 1, *inv[v[i]].begin() + 1});
      swp(i, *inv[v[i]].begin());
      ;
    }
    inv[v[i]].erase(inv[v[i]].find(i));
    ;
  }
  cout << ans.size() << '\n';
  for (auto x : ans) cout << x << '\n';
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  ;
  int T = 1;
  while (T--) {
    solve();
  }
  return 0;
}
