You are given m sets of integers A_1, A_2, …, A_m; elements of these sets are integers between 1 and n, inclusive.

There are two arrays of positive integers a_1, a_2, …, a_m and b_1, b_2, …, b_n. 

In one operation you can delete an element j from the set A_i and pay a_i + b_j coins for that.

You can make several (maybe none) operations (some sets can become empty).

After that, you will make an edge-colored undirected graph consisting of n vertices. For each set A_i you will add an edge (x, y) with color i for all x, y ∈ A_i and x < y. Some pairs of vertices can be connected with more than one edge, but such edges have different colors.

You call a cycle i_1 → e_1 → i_2 → e_2 → … → i_k → e_k → i_1 (e_j is some edge connecting vertices i_j and i_{j+1} in this graph) rainbow if all edges on it have different colors.

Find the minimum number of coins you should pay to get a graph without rainbow cycles.

Input

The first line contains two integers m and n (1 ≤ m, n ≤ 10^5), the number of sets and the number of vertices in the graph.

The second line contains m integers a_1, a_2, …, a_m (1 ≤ a_i ≤ 10^9).

The third line contains n integers b_1, b_2, …, b_n (1 ≤ b_i ≤ 10^9).

In the each of the next of m lines there are descriptions of sets. In the i-th line the first integer s_i (1 ≤ s_i ≤ n) is equal to the size of A_i. Then s_i integers follow: the elements of the set A_i. These integers are from 1 to n and distinct.

It is guaranteed that the sum of s_i for all 1 ≤ i ≤ m does not exceed 2 ⋅ 10^5.

Output

Print one integer: the minimum number of coins you should pay for operations to avoid rainbow cycles in the obtained graph.

Examples

Input


3 2
1 2 3
4 5
2 1 2
2 1 2
2 1 2


Output


11


Input


7 8
3 6 7 9 10 7 239
8 1 9 7 10 2 6 239
3 2 1 3
2 4 1
3 1 3 7
2 4 3
5 3 4 5 6 7
2 5 7
1 8


Output


66

Note

In the first test, you can make such operations:

  * Delete element 1 from set 1. You should pay a_1 + b_1 = 5 coins for that. 
  * Delete element 1 from set 2. You should pay a_2 + b_1 = 6 coins for that. 



You pay 11 coins in total. After these operations, the first and the second sets will be equal to \{2\} and the third set will be equal to \{1, 2\}.

So, the graph will consist of one edge (1, 2) of color 3.

In the second test, you can make such operations:

  * Delete element 1 from set 1. You should pay a_1 + b_1 = 11 coins for that. 
  * Delete element 4 from set 2. You should pay a_2 + b_4 = 13 coins for that. 
  * Delete element 7 from set 3. You should pay a_3 + b_7 = 13 coins for that. 
  * Delete element 4 from set 4. You should pay a_4 + b_4 = 16 coins for that. 
  * Delete element 7 from set 6. You should pay a_6 + b_7 = 13 coins for that. 



You pay 66 coins in total.

After these operations, the sets will be:

  * \{2, 3\}; 
  * \{1\}; 
  * \{1, 3\}; 
  * \{3\}; 
  * \{3, 4, 5, 6, 7\}; 
  * \{5\}; 
  * \{8\}. 



We will get the graph:

<image>

There are no rainbow cycles in it.
import java.io.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.InputMismatchException;

/**
 * Built using CHelper plug-in
 * Actual solution is at the top
 */
public class Main {
	static class TaskAdapter implements Runnable {
		@Override
		public void run() {
			long startTime = System.currentTimeMillis();
			InputStream inputStream = System.in;
			OutputStream outputStream = System.out;
			FastReader in = new FastReader(inputStream);
			Output out = new Output(outputStream);
			EAvoidRainbowCycles solver = new EAvoidRainbowCycles();
			solver.solve(1, in, out);
			out.close();
			System.err.println(System.currentTimeMillis()-startTime+"ms");
		}
	}

	public static void main(String[] args) throws Exception {
		Thread thread = new Thread(null, new TaskAdapter(), "", 1<<26);
		thread.start();
		thread.join();
	}

	static class EAvoidRainbowCycles {
		public EAvoidRainbowCycles() {
		}

		public void solve(int kase, InputReader in, Output pw) {
			int m = in.nextInt(), n = in.nextInt();
			int[] a = in.nextInt(m), b = in.nextInt(n);
			ArrayList<int[]> edges = new ArrayList<>();
			long ans = 0;
			for(int i = 0; i<m; i++) {
				int x = in.nextInt();
				for(int j = 0; j<x; j++) {
					int cur = in.nextInt()-1;
					ans += a[i]+b[cur];
					edges.add(new int[] {i, m+cur, a[i]+b[cur]});
				}
			}
			edges.sort(Comparator.comparingInt(o -> -o[2]));
			DSU dsu = new DSU(m+n);
			for(int[] edge: edges) {
				if(dsu.union(edge[0], edge[1])) {
					ans -= edge[2];
				}
			}
			pw.println(ans);
		}

	}

	static class Output implements Closeable, Flushable {
		public StringBuilder sb;
		public OutputStream os;
		public int BUFFER_SIZE;
		public String lineSeparator;

		public Output(OutputStream os) {
			this(os, 1<<16);
		}

		public Output(OutputStream os, int bs) {
			BUFFER_SIZE = bs;
			sb = new StringBuilder(BUFFER_SIZE);
			this.os = new BufferedOutputStream(os, 1<<17);
			lineSeparator = System.lineSeparator();
		}

		public void println(long l) {
			println(String.valueOf(l));
		}

		public void println(String s) {
			sb.append(s);
			println();
		}

		public void println() {
			sb.append(lineSeparator);
		}

		private void flushToBuffer() {
			try {
				os.write(sb.toString().getBytes());
			}catch(IOException e) {
				e.printStackTrace();
			}
			sb = new StringBuilder(BUFFER_SIZE);
		}

		public void flush() {
			try {
				flushToBuffer();
				os.flush();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}

		public void close() {
			flush();
			try {
				os.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}

	}

	static class DSU {
		public final int n;
		public int[] parent;
		public int[] size;

		public DSU(int n) {
			this.n = n;
			parent = new int[this.n];
			size = new int[this.n];
			for(int i = 0; i<this.n; i++) {
				parent[i] = i;
				size[i] = 1;
			}
		}

		public int find(int i) {
			if(parent[i]==i) {
				return i;
			}else {
				int result = find(parent[i]);
				parent[i] = result;
				return result;
			}
		}

		public boolean union(int i, int j) {
			int irep = find(i);
			int jrep = find(j);
			if(irep==jrep) {
				return false;
			}
			int irank = size[irep];
			int jrank = size[jrep];
			if(irank<=jrank) {
				parent[irep] = jrep;
				size[jrep] += size[irep];
			}else {
				parent[jrep] = irep;
				size[irep] += size[jrep];
			}
			return true;
		}

	}

	static class FastReader implements InputReader {
		final private int BUFFER_SIZE = 1<<16;
		private final DataInputStream din;
		private final byte[] buffer;
		private int bufferPointer;
		private int bytesRead;

		public FastReader(InputStream is) {
			din = new DataInputStream(is);
			buffer = new byte[BUFFER_SIZE];
			bufferPointer = bytesRead = 0;
		}

		public int nextInt() {
			int ret = 0;
			byte c = skipToDigit();
			boolean neg = (c=='-');
			if(neg) {
				c = read();
			}
			do {
				ret = ret*10+c-'0';
			} while((c = read())>='0'&&c<='9');
			if(neg) {
				return -ret;
			}
			return ret;
		}

		private boolean isDigit(byte b) {
			return b>='0'&&b<='9';
		}

		private byte skipToDigit() {
			byte ret;
			while(!isDigit(ret = read())&&ret!='-') ;
			return ret;
		}

		private void fillBuffer() {
			try {
				bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
			}catch(IOException e) {
				e.printStackTrace();
				throw new InputMismatchException();
			}
			if(bytesRead==-1) {
				buffer[0] = -1;
			}
		}

		private byte read() {
			if(bytesRead==-1) {
				throw new InputMismatchException();
			}else if(bufferPointer==bytesRead) {
				fillBuffer();
			}
			return buffer[bufferPointer++];
		}

	}

	interface InputReader {
		int nextInt();

		default int[] nextInt(int n) {
			int[] ret = new int[n];
			for(int i = 0; i<n; i++) {
				ret[i] = nextInt();
			}
			return ret;
		}

	}
}

