#include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint1000000007; using vi = vector; using vvi = vector; using vvvi = vector; using vll = vector; using vvll = vector; using vvvll = vector; using vmi = vector; using vvmi = vector; using vvvmi = vector; #define all(a) (a).begin(), (a).end() #define rep2(i, m, n) for (int i = (m); i < (n); ++i) #define rep(i, n) rep2(i, 0, n) #define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i) #define drep(i, n) drep2(i, n, 0) void solve(){ } mint op(mint a, mint b){ return a+b; } mint e(){return 0;} int o2(int a, int b){ return a+b; } int e2(){return 0;} int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int h, w; cin >> h >> w; vll a(h), b(w); rep(i, h){ cin >> a[i]; } set st; map mp; rep(i, w){ cin >> b[i]; mp[b[i]]++; st.insert(b[i]); } sort(all(a)); sort(all(b)); int s = h-1, t = w-1; mint a2 = 0; while(s >= 0 && t >= 0){ if(a[s] == b[t]){ a2 += mint(a[s]); s--; t--; }else if(a[s] < b[t]){ a2 += mint(b[t]); t--; }else{ a2 += mint(a[s]); s--; } } while(s >= 0){ a2 += mint(a[s]); s--; } while(t >= 0){ a2 += mint(b[t]); t--; }cout << a2.val() << endl; vll v; int len = st.size(); segtree seg(len); segtree s2(len); int itr = 0; for(auto i : st){ v.push_back(i); seg.set(itr, mint(i)*mint(mp[i])); s2.set(itr, mp[i]); itr++; } mint ans = mint(0); rep(i, h){ int c = lower_bound(all(v), a[i]) - begin(v); ans += seg.prod(0, c) + mint(a[i])*mint(s2.prod(c, len)); }cout << ans.val() << endl; return 0; }