Problema I: Pizzas

# | competition: "ICPC Pre-National Bolivia – 2024"
# | problem_id: "I"
# | title: "Pizzas"


class UnionFind:
    def __init__(self, size):
        self.parent = list(range(size))
        self.rank = [0] * size
        self.size = [1] * size

    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]

    def union(self, x, y):
        rootX = self.find(x)
        rootY = self.find(y)
        if rootX != rootY:
            if self.rank[rootX] > self.rank[rootY]:
                self.parent[rootY] = rootX
                self.size[rootX] += self.size[rootY]
            elif self.rank[rootX] < self.rank[rootY]:
                self.parent[rootX] = rootY
                self.size[rootY] += self.size[rootX]
            else:
                self.parent[rootY] = rootX
                self.rank[rootX] += 1
                self.size[rootX] += self.size[rootY]


MOD = 10**9 + 7

n, m = map(int, input().split())
uf = UnionFind(n + 1)

for _ in range(m):
    a, b = map(int, input().split())
    uf.union(a, b)

product = 1
seen = set()
for i in range(1, n + 1):
    root = uf.find(i)
    if root not in seen:
        product = (product * uf.size[root]) % MOD
        seen.add(root)

print(product)