#include<bits/stdc++.h>
using namespace std;

template <int MOD_> struct modnum {
	static constexpr int MOD = MOD_;
	static_assert(MOD_ > 0, "MOD must be positive");

private:
	using ll = long long;

	int v;

	static int minv(int a, int m) {
		a %= m;
		assert(a);
		return a == 1 ? 1 : int(m - ll(minv(m, a)) * ll(m) / a);
	}

public:

	modnum() : v(0) {}
	modnum(ll v_) : v(int(v_ % MOD)) { if (v < 0) v += MOD; }
	explicit operator int() const { return v; }
	friend std::ostream& operator << (std::ostream& out, const modnum& n) { return out << int(n); }
	friend std::istream& operator >> (std::istream& in, modnum& n) { ll v_; in >> v_; n = modnum(v_); return in; }

	friend bool operator == (const modnum& a, const modnum& b) { return a.v == b.v; }
	friend bool operator != (const modnum& a, const modnum& b) { return a.v != b.v; }

	modnum inv() const {
		modnum res;
		res.v = minv(v, MOD);
		return res;
	}
	friend modnum inv(const modnum& m) { return m.inv(); }
	modnum neg() const {
		modnum res;
		res.v = v ? MOD-v : 0;
		return res;
	}
	friend modnum neg(const modnum& m) { return m.neg(); }

	modnum operator- () const {
		return neg();
	}
	modnum operator+ () const {
		return modnum(*this);
	}

	modnum& operator ++ () {
		v ++;
		if (v == MOD) v = 0;
		return *this;
	}
	modnum& operator -- () {
		if (v == 0) v = MOD;
		v --;
		return *this;
	}
	modnum& operator += (const modnum& o) {
		v += o.v;
		if (v >= MOD) v -= MOD;
		return *this;
	}
	modnum& operator -= (const modnum& o) {
		v -= o.v;
		if (v < 0) v += MOD;
		return *this;
	}
	modnum& operator *= (const modnum& o) {
		v = int(ll(v) * ll(o.v) % MOD);
		return *this;
	}
	modnum& operator /= (const modnum& o) {
		return *this *= o.inv();
	}

	friend modnum operator ++ (modnum& a, int) { modnum r = a; ++a; return r; }
	friend modnum operator -- (modnum& a, int) { modnum r = a; --a; return r; }
	friend modnum operator + (const modnum& a, const modnum& b) { return modnum(a) += b; }
	friend modnum operator - (const modnum& a, const modnum& b) { return modnum(a) -= b; }
	friend modnum operator * (const modnum& a, const modnum& b) { return modnum(a) *= b; }
	friend modnum operator / (const modnum& a, const modnum& b) { return modnum(a) /= b; }
};

using num = modnum<998244353>;
const num BASE(int64_t(1e18));

template <typename T> T pow(T a, long long b) {
	assert(b >= 0);
	T r = 1; while (b) { if (b & 1) r *= a; b >>= 1; a *= a; } return r;
}

void slow() {
	int N; cin >> N;
	vector<vector<vector<int>>> adj(3, vector<vector<int>>(N));
	for (int z = 0; z < 3; z++) {
		int M; cin >> M;
		for (int e = 0; e < M; e++) {
			int u, v; cin >> u >> v; u--, v--;
			assert(u != v);
			if (u > v) swap(u, v);
			assert(u < v);
			adj[z][u].push_back(v);
		}
	}
	num ans = 0;
	vector<vector<vector<bool>>> take(N, vector<vector<bool>>(N, vector<bool>(N, false)));
	for (int s = 3*(N-1); s >= 0; s--) {
		for (int x = 0; x < N; x++) {
			for (int y = 0; y < N; y++) {
				int z = s-x-y;
				if (0 <= z && z < N) {
					take[x][y][z] = true;
					for (int x2 : adj[0][x]) {
						if (take[x2][y][z]) take[x][y][z] = false;
					}
					for (int y2 : adj[1][y]) {
						if (take[x][y2][z]) take[x][y][z] = false;
					}
					for (int z2 : adj[2][z]) {
						if (take[x][y][z2]) take[x][y][z] = false;
					}
					if (take[x][y][z]) {
						cerr << x+1 << ' ' << y+1 << ' ' << z+1 << '\n';
						ans += pow(BASE, x+y+z+3);
					}
				}
			}
		}
	}
	cout << ans << '\n';
}

int main() {
	ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int N; cin >> N;
	vector<num> cost(N);
	cost[0] = BASE;
	for (int i = 1; i < N; i++) cost[i] = cost[i-1] * BASE;

	const int LG = 9;
	const int S = 1 << LG;

	vector<num> ans(S, 1);

	for (int z = 0; z < 3; z++) {
		int M; cin >> M;
		vector<vector<int>> adj(N);
		for (int e = 0; e < M; e++) {
			int u, v; cin >> u >> v; u--, v--;
			assert(u != v);
			if (u > v) swap(u, v);
			assert(u < v);
			adj[u].push_back(v);
		}

		vector<num> cnt(S);
		vector<int> nimber(N);
		for (int i = N-1; i >= 0; i--) {
			set<int> s;
			for (int j : adj[i]) {
				s.insert(nimber[j]);
			}
			nimber[i] = 0;
			while (s.count(nimber[i])) nimber[i]++;
			cnt[nimber[i]] += cost[i];
		}
		for (int l = 0; l < LG; l++) {
			for (int m = 0; m < S; m++) {
				if (m & (1<<l)) continue;
				num s = cnt[m | (1<<l)];
				num a = cnt[m];
				cnt[m] = a+s;
				cnt[m|(1<<l)] = a-s;
			}
		}

		for (int m = 0; m < S; m++) {
			ans[m] *= cnt[m];
		}
	}

	for (int l = 0; l < LG; l++) {
		for (int m = 0; m < S; m++) {
			if (m & (1<<l)) continue;
			num s = ans[m | (1<<l)];
			num a = ans[m];
			ans[m] = (a+s)/2;
			ans[m|(1<<l)] = (a-s)/2;
		}
	}


	cout << ans[0] << '\n';

	return 0;
}

// sample2:
// 3,31,32
//
// 3,3,3
// 3,3,2
// 2,2,3
// 3,1,3
// 2,2,2
// 3,1,2
// 3,2,1
// 2,3,1


Measured memory_bytes: 5248