#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <sstream>
#include <iomanip>
#include <queue>
#include <ctime>
using namespace std;
template <class T> void checkmin(T &t,T x){if (x < t) t = x;}
template <class T> void checkmax(T &t,T x){if (x > t) t = x;}
template <class T> void _checkmin(T &t, T x){if (t == -1) t = x; if (x < t) t = x;}
template <class T> void _checkmax(T &t, T x){if (t == -1) t = x; if (x > t) t = x;}
typedef pair <int,int> PII;
typedef pair <double,double> PDD;
typedef long long lld;
#define foreach(it,v) for (__typeof((v).begin()) it = (v).begin();it != (v).end();it++)
#define DEBUG(a) cout << #a" = " << (a) << endl;
#define DEBUGARR(a, n) for (int i = 0; i < (n); i++) { cout << #a"[" << i << "] = " << (a)[i] << endl; }

struct Tire {
	int cnt;
	int sum[26];
	int ch[105555][26];

	void clr(int i){
		for (int j = 0; j < 26; j++) ch[i][j] = 0;
	}

	void init(){
		memset(sum, 0, sizeof(sum));
		cnt = 1;
		clr(1);
	}

	void insert(char *s) {
		int n = strlen(s);
		int p = 1;
		for (int i = 0; i < n; i++) {
			char c = s[i] - 'a';
			if (!ch[p][c]) {
				ch[p][c] = ++cnt;
				clr(cnt);
				if (i)
					sum[c]++;
			}
			p = ch[p][c];
		}
	}
}T1, T2;

int m, n;
char s[105555];

int main(){
#ifdef cwj
	freopen("in", "r", stdin);
#endif
	while (scanf("%d%d", &m, &n) && m + n) {
		T1.init();
		T2.init();
		for (int i = 0; i < m; i++) {
			scanf("%s", s);
			T1.insert(s);
		}
		for (int i = 0; i < n; i++) {
			scanf("%s", s);
			int len = strlen(s);
			reverse(s, s + len);
			T2.insert(s);
		}
		long long ans = 1LL * (T1.cnt - 1) * (T2.cnt - 1);
		for (int i = 0; i < 26; i++) {
			ans -= 1LL * T1.sum[i] * T2.sum[i];
		}
		cout << ans << endl;
	}
}
