#include <bits/stdc++.h>
#include <unordered_set>
#include <cmath>
#include <algorithm>
// #include <atcoder/all>

// URL: 

using namespace std;

using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vs = vector<string>;

#define dump(x) cout << #x << " = " << (x) << endl
#define YES(n) cout << ((n)? "YES": "NO") << endl
#define Yes(n) cout << ((n)? "Yes": "No") << endl

#define rept(i, a, b) for(int i = (int)(a); i < (int)(b); i++)
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define fore(x, a) for(auto& (x) : (a))

#define reptll(i, a, b) for(ll i = (ll)(a); i < (ll)(b); i++)
#define repll(i, n) for (ll i = 0; i < (ll)(n); i++)

#define ALL(a) (a).begin(), (a).end()

#define VECCIN(x) for(auto& youso_: (x)) cin >> youso_
#define VECCOUT(x) for(auto& youso_: (x)) cout << youso_ << " ";cout << endl

#define pb push_back
#define optimize_cin() cin.tie(0); ios::sync_with_stdio(false)

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

const ll INFL = numeric_limits<ll>::max() / 4;
const int INF = 1e9;
const int MOD = 1e9 + 7;

//数列a(a[0],a[1],…,a[n-1])についての区間和と点更新を扱う
//区間和,点更新,二分探索はO(log{n})で動作する
class BIT {
public:
  //データの長さ
  ll n;
  //データの格納先
  vector<ll> a;
  //コンストラクタ
  BIT(ll n):n(n),a(n+1,0){}

  //a[i]にxを加算する
  void add(ll i,ll x){
    i++;
    if(i==0) return;
    for(ll k=i;k<=n;k+=(k & -k)){
      a[k]+=x;
    }
  }

  //a[i]+a[i+1]+…+a[j]を求める
  ll sum(ll i,ll j){
    return sum(j)-sum(i-1);
  }

  //a[0]+a[1]+…+a[i]を求める
  ll sum(ll i){
    i++;
    ll s=0;
    if(i==0) return s;
    for(ll k=i;k>0;k-=(k & -k)){
      s+=a[k];
    }
    return s;
  }

  //a[0]+a[1]+…+a[i]>=xとなる最小のiを求める(任意のkでa[k]>=0が必要)
  ll lower_bound(ll x){
    if(x<=0){
      //xが0以下の場合は該当するものなし→0を返す
      return 0;
    }else{
      ll i=0;ll r=1;
      //最大としてありうる区間の長さを取得する
      //n以下の最小の二乗のべき(BITで管理する数列の区間で最大のもの)を求める
      while(r<n) r=r<<1;
      //区間の長さは調べるごとに半分になる
      for(int len=r;len>0;len=len>>1) {
        //その区間を採用する場合
        if(i+len<n && a[i+len]<x){
          x-=a[i+len];
          i+=len;
        }
      }
      return i;
    }
  }
};

int main(){
  optimize_cin();

  int N;
  cin >> N;
  vll A(N), B(N);
  vector<pll> paa(N), pab(N);
  ll SA = 0, SB = 0;
  rep(i, N) {cin >> A[i]; A[i] += i; paa[i] = make_pair(A[i], i);}
  rep(i, N) {cin >> B[i]; B[i] += i; pab[i] = make_pair(B[i], i);}

  sort(ALL(paa));
  sort(ALL(pab));

  vll C(N);
  rep(i, N) {
    if(paa[i].first != pab[i].first) {
      cout << -1 << endl;
      return 0;
    }
    C[paa[i].second] = pab[i].second;
  }
  // rep(i, N){
  //   cout << C[i] << endl;
  // }

  BIT bit(N);
  ll ans = 0;
  rep(i, N){
    ans += i - bit.sum(C[i]);
    bit.add(C[i], 1);
  }

  cout << ans << endl;




 


  return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; //int:2*10**9
typedef long double ld;
typedef pair<ll,ll> P;
#define REP(i,n) for(ll i = 0; i<(ll)(n); i++)
#define FOR(i,a,b) for(ll i=(a);i<=(b);i++)
#define FORD(i,a,b) for(ll i=(a);i>=(b);i--)
#define pb push_back
#define MOD 1000000007 //998244353
#define PI 3.141592653
#define INF 100000000000000 //14
//cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);

vector<ll> edges[1100][26];
vector<vector<ll>> paths(1100000);
ll dist[1100000];

int main(){
    ll n, m; cin >> n >> m;
    REP(i,m) {
        ll a, b; char c; cin >> a >> b >> c; a--; b--; c-='a';
        edges[a][c].pb(b); edges[b][c].pb(a);
    }
    REP(i,n) REP(j,n) {
        ll from = i*n+j;
        REP(k,26) {
            for (ll ito : edges[i][k]) for (ll jto : edges[j][k]) {
                ll to = ito*n+jto;
                paths[from].pb(to);
            }
        }
    }
    REP(i,1100000) dist[i]=INF;
    queue<ll> q; 
    q.push(n-1); dist[n-1]=0;
    while (!q.empty()) {
        ll nat = q.front(); q.pop();
        for (ll nex : paths[nat]) {
            if (dist[nex]!=INF) continue;
            dist[nex]=dist[nat]+1;
            q.push(nex);
        }
    }
    
    ll ans = INF;
    REP(i,n) {
        ans = min(ans,2*dist[i*n+i]);
        REP(j,26) for (ll to : edges[i][j]) {
            ans = min(ans,2*dist[i*n+to]+1);
        }
    }
    if (ans==INF) cout << -1 << endl;
    else cout << ans << endl;
    return 0;
}