#include <bits/stdc++.h>
using namespace std;
template <class T>
std::istream& operator>>(std::istream& in, std::vector<T>& data) {
  for (auto& item : data) {
    in >> item;
  }
  return in;
}
template <class T>
std::ostream& operator<<(std::ostream& out, const std::vector<T>& data) {
  bool first = true;
  for (const auto& item : data) {
    if (!first) {
      out << " ";
    }
    out << item;
    first = false;
  }
  return out;
}
int main() {
  int n, m;
  cin >> n >> m;
  vector<int64_t> b(n);
  vector<int64_t> g(m);
  int64_t b_max = 0;
  int64_t b_max_2 = 0;
  int64_t min_sum = 0;
  for (int i = 0; i < n; ++i) {
    cin >> b[i];
    if (b[i] >= b_max) {
      b_max_2 = b_max;
      b_max = b[i];
    } else if (b[i] >= b_max_2) {
      b_max_2 = b[i];
    }
    min_sum += b[i] * m;
  }
  int64_t g_min = (int64_t)1e8;
  for (int i = 0; i < m; ++i) {
    cin >> g[i];
    if (g[i] < g_min) {
      g_min = g[i];
    }
  }
  if (g_min < b_max) {
    cout << -1 << "\n";
    return 0;
  }
  bool used = false;
  int used_counter = 0;
  for (int i = 0; i < m - 1; ++i) {
    if (g[i] > b_max) {
      min_sum += (g[i] - b_max);
      used = true;
      ++used_counter;
    }
  }
  int64_t b_current = (used_counter == m - 1) ? b_max_2 : b_max;
  if (g.back() > b_max) {
    min_sum += (g.back() - b_current);
  }
  cout << min_sum << "\n";
  return 0;
}
