#include <bits/stdc++.h>
//#pragma GCC optimize ("O3")
 
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pii pair<int,int>
#define point pair<double,double>
#define segment pair<point,point>
#define circle pair<point,double> //titik pusat, radius
#define line pair<double,double> //m,c
#define ins insert
#define er erase
 
#define FORU(a,b,c) for(int a=b; a<=c; a++)
#define FORD(a,b,c) for(int a=b; a>=c; a--)
#define FOR(a,b) for(int a=1; a<=b; a++)
#define FORA(a,b) for(auto (a) : (b))
 
const double EPS = 1e-9;
const double PI = acos(-1);
const int MOD = 1e9+7;
 
#define yu using
#define don namespace
#define sei std
 
yu don sei;
 
//const int nPrime=100000;
//bool isprime[nPrime];
//vector<int>prime;
//
//void pre()
//{
//  memset(isprime,1,sizeof(isprime));
//  isprime[1]=0;
//  for(int i=2;i*i<=nPrime;i++)
//  {
//      for(int j=i*i;j<nPrime;j+=i)
//      {
//          isprime[j]=0;
//      }
//  }
//  for(int i=2;i<nPrime;i++)
//  {
//      if(isprime[i])prime.pb(i);
//  }
//}
 
// ll pwr(ll b,ll e)
// {
//  if(e==0)return 1;
//  if(e==1)return b;
//  ll temp=pwr(b,e/2);
//  if(e%2==0)
//  {
//      return (temp*temp);
//  }
//  else
//  {
//      return (temp*temp*b);
//  }
// }
 
// ll modpow(ll b,ll e)
// {
//  b%=MOD;
//  if(e==0)return 1;
//  if(e==1)return b%MOD;
//  ll temp=modpow(b,e/2);
//  if(e%2==0)
//  {
//      return (temp*temp) %MOD;
//  }
//  else
//  {
//      return ((temp*temp %MOD )*b)%MOD;
//  }
// }
 
ll gcd(ll a,ll b)
{
    if(b==0)return a;
    return gcd(b,a%b);
}
 
//int n,m;
 
//bool valid(int x,int y)
//{
//  if(x<0)return 0;
//  if(y<0)return 0;
//  if(x>=n)return 0;
//  if(y>=m)return 0;
//  return 1;
//}
 
//int p[]={-1,0,1,0};
//int q[]={0,1,0,-1};
 
//int p[]={-1,-1,-1,0,0,1,1,1};
//int q[]={-1,0,1,-1,1,-1,0,1};
 
point add(point a,point b)
{
    return {a.fi+b.fi,a.se+b.se};
}
 
point sub(point a,point b)
{
    return {a.fi-b.fi,a.se-b.se};
}
 
//double dist(point a,point b)
//{
//    return ((a.fi-b.fi)*(a.fi-b.fi) + (a.se-b.se)*(a.se-b.se));
//}
 
double dist(point a,point b)
{
    return sqrt((a.fi-b.fi)*(a.fi-b.fi) + (a.se-b.se)*(a.se-b.se));
}
 
//double distPS(point a,segment b)//heron formula, extreemely prone to precison error
//{
//    double AB=rdist(a,b.fi);
//    double AC=rdist(a,b.se);
//    double BC=rdist(b.fi,b.se);
//    double s=AB+AC+BC;
//    s/=2.0;
//    return 2*sqrt(s*(s-AB)*(s-BC)*(s-AC))/BC;
//}
 
double dabs(double a)
{
    if(a+EPS>0)return a;
    return -a;
}
 
double dotProduct(point a,point b)
{
    return a.fi*b.fi + a.se*b.se;
}
 
double crossProduct(point a,point b)
{
    return a.fi*b.se - a.se*b.fi;
}
 
int ccw(point a,point b,point c)// -1 CCW 0 COL 1 CW
{
    double tmp=crossProduct(sub(b,a),sub(c,a));
    if(tmp>EPS)
    {
        return -1;
    }
    else if(tmp<-EPS)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
 
point intLiLi(point a,point b,point c,point d)
{
    return mp(((a.fi*b.se-b.fi*a.se)*(c.fi-d.fi) - (a.fi-b.fi)*(c.fi*d.se-d.fi*c.se))/((a.fi-b.fi)*(c.se-d.se) - (a.se-b.se)*(c.fi-d.fi) ),
            ((a.fi*b.se-b.fi*a.se)*(c.se-d.se)-(a.se-b.se)*(c.fi*d.se-d.fi*c.se))/((a.fi-b.fi)*(c.se-d.se) - (a.se-b.se)*(c.fi-d.fi) ));
}
 
list<int> A[100010];

ll memo[100010][3];

ll dp(int n, int bapak_item)
{
    if(memo[n][bapak_item]!=-1)return memo[n][bapak_item];
    memo[n][bapak_item] = 1;
    ll temp = 1;
    for(int i:A[n])
    {
        if(bapak_item==0)
        {
            temp*=dp(i,1);
            temp%=MOD;
        }
        memo[n][bapak_item]*=dp(i, 0);
        memo[n][bapak_item]%=MOD;
    }
    if(bapak_item==0)
    {
        memo[n][bapak_item]+=temp;
        memo[n][bapak_item]%=MOD;
    }
    if(A[n].size()==0)
    {
        if(bapak_item==1)memo[n][bapak_item] = 1;
        else memo[n][bapak_item] = 2;
    }
    // cout << n << " " << bapak_item << " " << memo[n][bapak_item] << endl;
    return memo[n][bapak_item];
}

bool visit[100010];

set<pii>S;

void dfs(int u)
{
    visit[u] = 1;
    for(int v:A[u])
    {
        if(visit[v])continue;
        // cout << u << "->" << v << endl;
        S.insert(mp(u,v));
        dfs(v);
    }
}

int main()
{
    memset(memo, -1, sizeof(memo));
    memset(visit, 0, sizeof(visit));
    int n;
    cin>>n;
    for(int i=0;i<n-1;i++)
    {
        int x,y;
        cin>>x>>y;
        A[x].pb(y);
        A[y].pb(x);
    }
    dfs(1);
    for(int i=1;i<=n;i++)
    {
        auto it = A[i].begin();
        while(it!=A[i].end())
        {
            // cout << i << " " << *it << endl;
            if(S.count(mp(i, *it))==0)
            {
                auto itt = it;
                it++;
                A[i].erase(itt);
            }
            else it++;
        }
        // cout << i << ": ";
        // for(int j:A[i])
        // {
        //     cout << j << " ";
        // }
        // cout << endl;
    }
    cout << dp(1,0) << endl;
    return 0;
}

Measured memory_bytes: 23552