package main

import (
	"fmt"
	"sort"
)

func min(a, b, c int) int {
	if a <=b && a <=c {
        return a
    } else if b <= a && b <= c {
        return b
    }
    return c
}

func solve(C1, C2 []int) int {
	// 合并并统计频次
	count := make(map[int]int)
    globalMin := C1[0]
	for _, x := range C1 {
		count[x]++
        if x < globalMin {
            globalMin = x
        }
	}
	for _, x := range C2 {
		count[x]++
        if x < globalMin {
            globalMin = x
        }
	}

	// 检查是否所有频次为偶数
	for _, cnt := range count {
		if cnt%2 != 0 {
			return -1
		}
	}

	// 构造目标:每个值出现 cnt/2 次
	target := []int{}
	for x, cnt := range count {
		for i := 0; i < cnt/2; i++ {
			target = append(target, x)
		}
	}
	sort.Ints(target)

	// 统计 C1 中每个值的实际频次
	cnt1 := make(map[int]int)
	for _, x := range C1 {
		cnt1[x]++
	}

	// 找出 C1 中多出的元素
	excess1 := []int{}
	for _, x := range target {
		if cnt1[x] > 0 {
			cnt1[x]--
		} else {
			excess1 = append(excess1, x)
		}
	}

	// C2 同理
	cnt2 := make(map[int]int)
	for _, x := range C2 {
		cnt2[x]++
	}
	excess2 := []int{}
	for _, x := range target {
		if cnt2[x] > 0 {
			cnt2[x]--
		} else {
			excess2 = append(excess2, x)
		}
	}

	// 应该相等
	if len(excess1) != len(excess2) {
		return -1 // 理论上不会发生
	}

	k := len(excess1)
	if k == 0 {
		return 0
	}

	// 贪心配对:排序后一一配对
	sort.Ints(excess1) // 升序
	sort.Sort(sort.Reverse(sort.IntSlice(excess2))) // 逆序

	cost := 0
	for i := 0; i < k; i++ {
		cost += min(2*globalMin, excess1[i], excess2[i]) // 小配大,或中介
	}

	return cost
}

func main() {
	var M int
	fmt.Scanf("%d", &M)

	C1 := make([]int, M)
	C2 := make([]int, M)

	for i := 0; i < M; i++ {
		fmt.Scanf("%d", &C1[i])
	}
	for i := 0; i < M; i++ {
		fmt.Scanf("%d", &C2[i])
	}

	result := solve(C1, C2)
	fmt.Println(result)
}