#include <bits/stdc++.h>
#pragma warning(disable : 4996)
using namespace std;
int n, m, q;
long long d[14][1 << 14][14];
vector<int> edge[14];
vector<pair<int, int> > lca[14];
long long back(int root, int mask, int st) {
  int i, j, k;
  if (d[root][mask][st] != -1) return d[root][mask][st];
  d[root][mask][st] = 0;
  if (st == 0) {
    for (auto e : lca[root]) {
      if (!((1 << e.first) & mask) || !((1 << e.second) & mask)) return 0;
    }
  }
  if ((1 << root) == mask) return d[root][mask][st] = 1;
  for (i = mask; i > 0; i = (i - 1) & mask) {
    if (i & (1 << root)) continue;
    for (j = st; j < n; j++) {
      if (!(i & (1 << j))) continue;
      int flag = 0;
      for (k = 0; k < n; k++)
        for (auto e : edge[k]) {
          if (((1 << k) & i) && ((1 << e) & (mask ^ i)) &&
              (k != j || e != root)) {
            flag = 1;
            break;
          }
          if (((1 << e) & i) && ((1 << k) & (mask ^ i)) &&
              (e != j || k != root)) {
            flag = 1;
            break;
          }
        }
      if (flag) continue;
      for (auto e : lca[root]) {
        if (((1 << e.first) & i) && ((1 << e.second) & i)) {
          flag = 1;
          break;
        }
      }
      if (flag) continue;
      d[root][mask][st] += back(j, i, 0) * back(root, mask ^ i, j + 1);
    }
  }
  return d[root][mask][st];
}
int main() {
  int i, j, k;
  memset(d, -1, sizeof(d));
  cin >> n >> m >> q;
  for (i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y, x--, y--;
    edge[x].push_back(y), edge[y].push_back(x);
  }
  for (i = 0; i < q; i++) {
    int x, y, z;
    cin >> x >> y >> z, x--, y--, z--;
    lca[z].push_back(pair<int, int>(x, y));
  }
  cout << back(0, (1 << n) - 1, 0);
  return 0;
}
