#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define X first #define Y second #define pb push_back #define bit(x) (1 << (x)) #define bnum(x) (__builtin_popcount(x)) #define all(x) (x).begin(), (x).end() #define mset0(x) memset((x), 0, sizeof((x))) #define mset1(x) memset((x), -1, sizeof((x))) #define LET(x,a) __typeof(a) x(a) #define REP(v,it) for( LET(it,v.begin()) ; it != v.end() ; it++) #define sz(x) ((int)(x.size())) #define PQ priority_queue #define sqr(x) ((x) * (x)) using namespace std; typedef long long LL; typedef pair pii; typedef vector vi; typedef vector vpii; template inline void chkmin(T &a, T b) { if (b < a) a = b; } template inline void chkmax(T &a, T b) { if (a < b) a = b; } const int MX = 1005; double x[MX], y[MX]; int con[MX][MX]; int ans, rlt, n; int a[5]; void calc(int k, int p) { if (k == 4) { if (k > ans) ans = k, rlt = 1; else if (k == ans) rlt++; return; } for (int i = p; i <= n; i++) { int j; for (j = 0; j < k; j++) if (!con[i][a[j]]) break; if (j == k) { a[k] = i; calc(k + 1, i + 1); } } if (k > ans) ans = k, rlt = 1; else if (k == ans) rlt++; return; } int main() { int m; int i, j; while (scanf("%d%d", &n, &m) == 2) { for (i = 0; i < n; i++) scanf("%d%d", x + i, y + i); mset0(con); ans = 0, rlt = 0; while (m--) { int u, v; scanf("%d%d", &u, &v); con[u][v] = con[v][u] = 1; } calc(0, 1); printf("%d %d\n", ans, rlt); } return 0; }