#include <bits/stdc++.h>
using namespace std;
struct node {
  int kd, x, y, z;
  node() {}
  node(int _kd, int _x, int _y, int _z) { kd = _kd, x = _x, y = _y, z = _z; }
} r[150];
int n, m, q;
long long f[13][1 << 13];
bool ok(int m1, int rt, int m2, int ch) {
  for (int i = 1; i <= m + q; i++) {
    int x = r[i].x, y = r[i].y;
    if (!((m1 >> x) & 1) || !((m1 >> y) & 1)) continue;
    if (((m2 >> x) & 1) == ((m2 >> y) & 1)) continue;
    if (i <= m) {
      if (y == rt) swap(x, y);
      if (x != rt || y != ch) return 0;
    } else if (r[i].z != rt)
      return 0;
  }
  return 1;
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    r[i] = node(0, --x, --y, 0);
  }
  for (int i = 1; i <= q; i++) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    if (x == y && z != x) return puts("0"), 0;
    r[i + m] = node(1, --x, --y, --z);
  }
  for (int i = 0; i <= n - 1; i++) f[i][1 << i] = 1;
  for (int i = 0; i <= (1 << n) - 1; i++)
    for (int rt = 0; rt <= n - 1; rt++)
      if ((i >> rt) & 1) {
        int ch = -1;
        for (int j = 0; j <= n - 1; j++)
          if (((i >> j) & 1) && (j ^ rt)) {
            ch = j;
            break;
          }
        if (ch == -1) continue;
        for (int msk = i; msk; --msk, msk &= i)
          if (!((msk >> rt) & 1) && ((msk >> ch) & 1)) {
            for (int CH = 0; CH <= n - 1; CH++)
              if (((msk >> CH) & 1) and (ok(i, rt, msk, CH)))
                f[rt][i] += f[rt][i ^ msk] * f[CH][msk];
          }
      }
  printf("%I64d\n", f[0][(1 << n) - 1]);
  return 0;
}
