#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
const int MAXN = 500000;
const int MOD = 998244353;
struct Res {
  int cntrootused, cntrootunused, summatching;
  Res(long long cntrootused, long long cntrootunused, long long summatching)
      : cntrootused(cntrootused),
        cntrootunused(cntrootunused),
        summatching(summatching) {}
};
int n;
vector<int> adj[MAXN];
Res dfs(int at, int par) {
  Res ret(0, 1, 0);
  for (int i = (0); i < (((int)(adj[at]).size())); ++i) {
    int to = adj[at][i];
    if (to == par) continue;
    Res sub = dfs(to, at);
    long long nrootused = 0;
    long long nrootunused = 0;
    long long nsummatching = 0;
    nrootused +=
        (long long)ret.cntrootused * (sub.cntrootused + sub.cntrootunused);
    nrootunused +=
        (long long)ret.cntrootunused * (sub.cntrootused + sub.cntrootunused);
    nsummatching +=
        (long long)(ret.cntrootused + ret.cntrootunused) * sub.summatching +
        (long long)ret.summatching * (sub.cntrootused + sub.cntrootunused);
    nrootused +=
        (long long)ret.cntrootused * (sub.cntrootused + sub.cntrootunused);
    nrootused += (long long)ret.cntrootunused * sub.cntrootunused;
    nrootunused += (long long)ret.cntrootunused * sub.cntrootused;
    nsummatching +=
        (long long)(ret.cntrootused + ret.cntrootunused) * sub.summatching +
        (long long)ret.summatching * (sub.cntrootused + sub.cntrootunused);
    nsummatching += (long long)2 * ret.cntrootunused * sub.cntrootunused;
    ret = Res(nrootused % MOD, nrootunused % MOD, nsummatching % MOD);
  }
  return ret;
}
int solve() {
  Res res = dfs(0, -1);
  return res.summatching;
}
void run() {
  scanf("%d", &n);
  for (int i = (0); i < (n - 1); ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a, --b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  printf("%d\n", solve());
}
int main() {
  run();
  return 0;
}
