import sys

sys.setrecursionlimit(1000000000)

input = sys.stdin.readline

mod=10**9+7

n=int(eval(input()))

es=[[] for i in range(n)]

for i in range(n-1):

   a,b=list(map(int,input().split()))

   es[a-1].append(b-1)

   es[b-1].append(a-1)

dp=[[0,0] for i in range(n)]

def dfs(v,c,p):

    if dp[v][c]:

        return dp[v][c]

    ans=1

    if c:

        for i in es[v]:

            if i-p:

                ans*=dfs(i,0,v)+dfs(i,1,v)

                ans%=mod

    else:

        for i in es[v]:

            if i-p:

                ans*=dfs(i,1,v)

                ans%=mod

    # print(ans,c,v)

    dp[v][c]=ans

    return ans

print(((dfs(0,0,-1)+dfs(0,1,-1))%mod))
#dp[i][j]=(頂点iをjで塗った時,iを親とする部分木の塗り方の場合の数) j=0:黒 j=1:白

#dp[i][0]=(dp[k][0])の総乗(kはiの子)

#dp[i][1]=(dp[k][0]+dp[k][1])の総乗(kはiの子)

import sys

sys.setrecursionlimit(1000000000)

input = sys.stdin.readline

mod=10**9+7

n=int(eval(input()))

es=[[] for i in range(n)]

for i in range(n-1):

   a,b=list(map(int,input().split()))

   es[a-1].append(b-1)

   es[b-1].append(a-1)

dp=[[0,0] for i in range(n)]

def dfs(v,p):

    if dp[v][0]:

        return

    dp[v][0]=dp[v][1]=1

    for i in es[v]:

        if i-p:

            dfs(i,v)

            dp[v][0]*=dp[i][1]

            dp[v][0]%=mod

            dp[v][1]*=dp[i][0]+dp[i][1]

            dp[v][1]%=mod

dfs(0,-1)

print(((dp[0][0]+dp[0][1])%mod))
import sys

sys.setrecursionlimit(1000000000)
input = sys.stdin.readline
mod = 10**9 + 7
n = int(eval(input()))
es = [[] for i in range(n)]
for i in range(n - 1):
    a, b = list(map(int, input().split()))
    es[a - 1].append(b - 1)
    es[b - 1].append(a - 1)
dp = [[0, 0] for i in range(n)]


def dfs(v, c, p):
    if dp[v][c]:
        return dp[v][c]
    ans = 1
    if c:
        for i in es[v]:
            if i - p:
                ans *= dfs(i, 0, v) + dfs(i, 1, v)
                ans %= mod
    else:
        for i in es[v]:
            if i - p:
                ans *= dfs(i, 1, v)
                ans %= mod
    # print(ans,c,v)
    dp[v][c] = ans
    return ans


print(((dfs(0, 0, -1) + dfs(0, 1, -1)) % mod))

# dp[i][j]=(頂点iをjで塗った時,iを親とする部分木の塗り方の場合の数) j=0:黒 j=1:白
# dp[i][0]=(dp[k][0])の総乗(kはiの子)
# dp[i][1]=(dp[k][0]+dp[k][1])の総乗(kはiの子)
import sys

sys.setrecursionlimit(1000000000)
input = sys.stdin.readline
mod = 10**9 + 7
n = int(eval(input()))
es = [[] for i in range(n)]
for i in range(n - 1):
    a, b = list(map(int, input().split()))
    es[a - 1].append(b - 1)
    es[b - 1].append(a - 1)
dp = [[0, 0] for i in range(n)]


def dfs(v, p):
    if dp[v][0]:
        return
    dp[v][0] = dp[v][1] = 1
    for i in es[v]:
        if i - p:
            dfs(i, v)
            dp[v][0] *= dp[i][1]
            dp[v][0] %= mod
            dp[v][1] *= dp[i][0] + dp[i][1]
            dp[v][1] %= mod


dfs(0, -1)
print(((dp[0][0] + dp[0][1]) % mod))

+# dp[i][j]=(頂点iをjで塗った時,iを親とする部分木の塗り方の場合の数) j=0:黒 j=1:白 +# dp[i][0]=(dp[k][0])の総乗(kはiの子) +# dp[i][1]=(dp[k][0]+dp[k][1])の総乗(kはiの子) -def dfs(v, c, p): -    if dp[v][c]: -        return dp[v][c] -    ans = 1 -    if c: -        for i in es[v]: -            if i - p: -                ans *= dfs(i, 0, v) + dfs(i, 1, v) -                ans %= mod -    else: -        for i in es[v]: -            if i - p: -                ans *= dfs(i, 1, v) -                ans %= mod -    # print(ans,c,v) -    dp[v][c] = ans -    return ans +def dfs(v, p): +    if dp[v][0]: +        return +    dp[v][0] = dp[v][1] = 1 +    for i in es[v]: +        if i - p: +            dfs(i, v) +            dp[v][0] *= dp[i][1] +            dp[v][0] %= mod +            dp[v][1] *= dp[i][0] + dp[i][1] +            dp[v][1] %= mod -print(((dfs(0, 0, -1) + dfs(0, 1, -1)) % mod)) +dfs(0, -1) +print(((dp[0][0] + dp[0][1]) % mod))